Hello Omi

Omi框架的每个组件都继承自Omi.Component,本篇会去完成Omi的Component的基本锥形,让其能够渲染第一个组件。

omi.js实现

var Omi = {};
Omi._instanceId = 0;
Omi.getInstanceId = function () {return Omi._instanceId++;
};Omi.render = function(component, renderTo){component.renderTo = typeof renderTo === "string" ? document.querySelector(renderTo) : renderTo;component._render();return component;
};module.exports = Omi;
  • Omi.getInstanceId 用来给每个组件生成自增的ID
  • Omi.render 用来把组件渲染到页面

基类Omi.Component实现

所有的组件都是继承自Omi.Component。

import Omi from './omi.js';class Component {constructor(data) {this.data = data || {};this.id = Omi.getInstanceId();this.HTML = null;this.renderTo = null;}_render() {this.HTML = this.render();this.renderTo.innerHTML = this.HTML;}
}export default Component;
  • Omi使用完全面向对象的方式去开发组件,这里约定好带有下划线的方法是用于内部实现调用,不建议Omi框架的使用者去调用。
  • 其中,_render为私有方法用于内部实现调用,会去调用组件的真正render方法用于生成HTML,并且把生成的HTML插入到renderTo容器里面。
  • 注意,这里目前没有引入dom diff,不管第几次渲染都是无脑设置innerHTML,复杂HTML结构对浏览器的开销很大,这里后续会引入diff。

index.js整合

import Omi from './omi.js';
import Component from './component.js';Omi.Component = Component;window.Omi = Omi;
module.exports = Omi;

这里把Omi给直接暴露在window下,因为每个组件都生成了唯一的ID,后续实现事件作用域以及对象实例获取都要通过window下的Omi获取。

最后使用

实现完omi.js和component.js以及index.js之后,你就可以实现Hello Omi拉:

import Omi from 'index.js';
//或者使用webpack build之后的omi.js
//import Omi from 'omi.js';class Hello extends Omi.Component {constructor(data) {super(data);}render() {return  `<div><h1>Hello ,`+ this.data.name +`!</h1></div>`;}
}Omi.render(new Hello({ name : 'Omi' }),"#container");

什么?都2017年了还在拼接字符串?!虽然ES6+的template string让多行字符串拼接更加得心应手,但是template string+模板引擎可以让更加优雅方便。既然用了template string,也可以写成这样子:

class Hello extends Omi.Component {constructor(data) {super(data);}render() {return  `<div><h1>Hello ,${this.data.name}!</h1></div>`;}
}Omi.render(new Hello({ name : 'Omi' }),"#container");

引入mustachejs模板引擎

Omi支持任意模板引擎。可以看到,上面是通过拼接字符串的形式生成HTML,这里当然可以使用模板引擎。

修改一下index.js:

import Omi from './omi.js';
import Mustache from './mustache.js';
import Component from './component.js';Omi.template = Mustache.render;
Omi.Component = Component;window.Omi=Omi;
module.exports = Omi;

这里把Mustache.render挂载在Omi.template下。再修改一下component.js:

import Omi from './omi.js';class Component {constructor(data) {this.data = data || {};this.id = Omi.getInstanceId();this.HTML = null;}_render() {this.HTML = Omi.template(this.render(), this.data);this.renderTo.innerHTML = this.HTML;}
}export default Component;

Omi.template(即Mustache.render)需要接受两个参数,第一个参数是模板,第二个参数是模板使用的数据。

现在,你便可以使用mustachejs模板引擎的语法了:

class Hello extends Omi.Component {constructor(data) {super(data);}render() {return  `<div><h1>Hello ,{{name}}!</h1></div>`;}
}

从上面的代码可以看到,你完全可以重写Omi.template方法去使用任意模板引擎。重写Omi.template的话,建议使用omi.lite.js,因为omi.lite.js是不包含任何模板引擎的。那么怎么build出两个版本的omi?且看webpack里设置的多入口:

 entry: {omi: './src/index.js','omi.lite': './src/index.lite.js'
},
output: {path: 'dist/',library:'Omi',libraryTarget: 'umd',filename:  '[name].js'
},

index.lite.js的代码如下:

import Omi from './omi.js';
import Component from './component.js';Omi.template = function(tpl, data){return tpl;
}Omi.Component = Component;window.Omi=Omi;
module.exports = Omi;

可以看到Omi.template没有对tpl做任何处理直接返回,开发者可以重写该方法。

总结

到目前为止,已经实现了:

  • 第一个组件的渲染
  • 模板引擎的接入
  • 多入口打包omi.js和omi.lite.js

下片,将介绍《Omi原理-局部CSS》,欢迎关注...

招募计划

  • Omi的Github地址https://github.com/AlloyTeam/omi
  • 如果想体验一下Omi框架,请点击Omi Playground
  • 如果想使用Omi框架,请阅读 Omi使用文档
  • 如果想一起开发完善Omi框架,有更好的解决方案或者思路,请阅读 从零一步步打造web组件化框架Omi
  • 关于上面的两类文档,如果你想获得更佳的阅读体验,可以访问Docs Website
  • 如果你懒得搭建项目脚手架,可以试试Scaffolding for Omi,npm安装omis便可
  • 如果你有Omi相关的问题可以New issue
  • 如果想更加方便的交流关于Omi的一切可以加入QQ的Omi交流群(256426170)

Omi原理-Hello Omi相关推荐

  1. Omi框架学习之旅 - 插件机制之omi-touch 及原理说明

    这个插件也能做好多好多的事,比如上拉下拉加载数据,轮播,等一切和运动有关的特效. 具体看我的allowTouch这篇博客,掌握了其用法,在来看它是怎么和omi结合的.就会很简单. 当然使用起来也比较方 ...

  2. OMI卫星数据介绍[整理]

    重点参考:OMI卫星数据介绍(包含气溶胶产品)作者:ENVI-IDL技术殿堂 Aura卫星传感器 Aura 在拉丁文中表示空气,主要任务是对地球臭氧层.空气质量和气候变化等方面进行观测研究.它于200 ...

  3. Omi - 前端跨框架跨平台框架

    Omi - 前端跨框架跨平台框架 基于 Web Components 并支持 IE8+(omio),小程序(omip) 和 任意前端框架集成 Omi 生态 → Omi 生态学习路线图 基础生态 项目 ...

  4. Omi v1.0震撼发布 - 令人窒息的Web组件化框架

    原文链接--https://github.com/AlloyTeam/omi 写在前面 Omi框架经过几十个版本的迭代,越来越简便易用和强大. 经过周末的连续通宵加班加点,Omi v1.0版本终于问世 ...

  5. OMI产品介绍(含气溶胶产品及数据下载读取方法)

    本文介绍参考:OMI卫星数据介绍(包含气溶胶产品) - ENVI-IDL技术殿堂 - 博客园 1. Aura卫星及其搭载的传感器 Aura (在拉丁文中表示空气)于2004年7月15日发射升空,是由多 ...

  6. 腾讯 Omi 生态发布

    写在前面 Omi 4.0 发布至今,收到了大量的意见和建议以及真刀真枪的 PR,虽然现在接受 Omi 都是外国友人,但是随着 IE 市场份额的慢慢消失,可以遇见的未来,国人也会慢慢拥抱 Omi.Omi ...

  7. 开源项目介绍|OMI - 前端跨框架框架

    2022腾讯犀牛鸟开源人才培养计划 开源项目介绍 滑至文末报名参与开源人才培养计划 提交 OMI 项目Proposal OMI 项目介绍 OMI 是基于webcomponents前端跨框架框架,曾荣登 ...

  8. 【腾讯犀牛鸟开源人才培养计划】萌新的开源心得之Omi框架

    [腾讯犀牛鸟开源人才培养计划]萌新的开源心得之Omi框架 一. 前景概要 (1).自我介绍: 我在一些机缘巧合下了解到了前端这个领域,是一个在经过一段时间对js.html.css以及一些前端框架的学习 ...

  9. 开放式管理基础omi

    开放管理基础设施(OMI)是一个开源项目,旨在进一步开发DMTF CIM / WBEM标准的生产质量实施.OMI CIMOM还设计为便携式和高度模块化.为了实现其占用空间小,它采用C编码,这也使其成为 ...

最新文章

  1. URAL 1993 This cheeseburger you don't need
  2. 2019区块链广泛应用于能源领域 ,DMA基金会,服务于区块链产业
  3. ubuntu+2080ti系统用anaconda 安装tensorflow
  4. 返回的到的数据做整合_Excel玩转数据分析常用的43个函数!(建议收藏)
  5. Java项目课程03:涉及知识点
  6. asp,jsp,php等web开发必懂技术---什么时候使用静态页,什么时候必须使用动态页...
  7. 添加Centos缺失的命令
  8. SpyEye on Android
  9. HTML和XHTML解析(HTMLParser、BeautifulSoup)
  10. 深入分析MVC中通过IOC实现Controller依赖注入的原理
  11. Excel重要知识点及学习分享
  12. 倾斜摄影三维建模全流程
  13. python自动发邮件运行正常就是收不到邮件是为什么_Python自动化测试发送邮件太麻烦?!一起聊一聊 Python 发送邮件的3种方式...
  14. 【个人总结】 2016年个人年度总结
  15. 同步和异步Socket多线程编程基本模型介绍
  16. html表单按钮底部居中,Ant design StepsForm中如何使底部按钮居中
  17. SqlServer数据库 时间类型字段添加默认值 设置时间格式
  18. 聂易铭:3月11日数字货币插针诱惑,做多只能浅尝辄止
  19. 大数据量查询视图应用
  20. HDU 5873 Football Games(竞赛图兰道定理)

热门文章

  1. css实现的立方体自动循环翻转动画html页面源码
  2. WordPress建站
  3. 北师大 python培训为学生科学探梦插上翅膀
  4. 快速排序(交换排序)
  5. 7-1 判断一个三位数是否为水仙花数
  6. java高级技术交流群
  7. 擎创技术流 | ClickHouse实用工具—ckman教程(7)
  8. 使用索引为什么能提高查询速度?
  9. ChatGPT怎么用?几个技巧让你快速掌握使用!
  10. 【XJC-1/3 DC220V静态冲击继电器】