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原理-Hello Omi的更多相关文章

  1. Omi原理-环境搭建

    环境搭建 Omi框架使用 Webpack + ES6 的方式去开发:使用karma+jasmine来作为Omi的测试工具. Karma介绍 Karma是一个基于Node.js的JavaScript测试 ...

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

    先来看看官网的介绍吧:https://github.com/AlloyTeam/omi/tree/master/plugins/omi-router 其实我推荐直接看官网的介绍.我所写的,主要给个人做 ...

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

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

  4. 2017年试试Web组件化框架Omi

    Open and modern framework for building user interfaces. Omi的Github地址https://github.com/AlloyTeam/omi ...

  5. Omi教程-通讯通讯攻略大全

    组件通讯 Omi框架组建间的通讯非常遍历灵活,因为有许多可选方案进行通讯: 通过在组件上声明 data-* 传递给子节点 通过在组件上声明 data 传递给子节点 (支持复杂数据类型的映射) 父容器设 ...

  6. Omi教程-生命周期和事件处理

    生命周期 名称 含义 时机 constructor 构造函数 new的时候 install 初始化安装,这可以拿到用户传进的data进行处理 实例化 installed 安装完成,HTML已经插入页面 ...

  7. Omi实战-QQ附近用户列表Web页

    原文地址https://github.com/AlloyTeam/omi/blob/master/docs/cn_pr_nearby.md 写在前面 Omi很适合大型复杂的Web页面开发,例如一些We ...

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

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

  9. Omi v1.0.2发布 - 正式支持传递javascript表达式

    原文地址:https://github.com/AlloyTeam/omi/ 写在前面 Omi框架可以通过在组件上声明 data-* 把属性传递给子节点. Omi从设计之初,就是往标准的DOM标签的标 ...

随机推荐

  1. jpg转bmp(使用libjpeg)

    源: jpg转bmp(使用libjpeg) [转]JPEG压缩原理 bmp转jpg(使用libjpeg)

  2. slf4j与logback对接是如何将日志写到控制台的

    今天一个以前同事问了个RT的问题 我翻了下代码,简单跟了下 很简单 1. demo代码 package org.simonme.demo.log; import org.slf4j.Logger; i ...

  3. ios 自定义NSError

    from:[object-c错误处理]http://www.androiddev.net/objective-c%E5%AD%A6%E4%B9%A0%E4%B9%8B%E9%94%99%E8%AF%A ...

  4. Set笔记

    Set 继承自Collection的一个接口,特点是:无序,不可重复.注意啊!!只有Collection实现了迭代器!也就是说Map是没有实现迭代器的,需要keySet,values,entrySet ...

  5. ndk-stack 调试 android c++ 代码崩溃位置

    在android下面使用jni来调用c++,在开发游戏是非常正常的.但是要调试c++部分却是非常麻烦的问题.如果快速定位崩溃位置呢.NDK提供了一个小工具ndk-stack. 首先,我们先配置环境,把 ...

  6. locate/slocate命令

    locate命令和slocate命令都用来查找文件或目录. locate命令其实是find -name的另一种写法,但是要比后者快得多,原因在于它不搜索具体目录,而是搜索一个数据库/var/lib/l ...

  7. UVa 11631 - Dark roads

    题目大意:政府为了减小开支决定关闭一些路灯,同时保证照亮的路能连接所有路口. 又是一个MST问题,Kruskal算法,不过数据规模比较大,又Submission Error了...扔这吧... #in ...

  8. 大数据竞赛平台——Kaggle 入门

    Reference: http://blog.csdn.net/witnessai1/article/details/52612012 Kaggle是一个数据分析的竞赛平台,网址:https://ww ...

  9. UVa 10148 - Advertisement

    题目大意:有一些广告牌,为了使跑步者看到固定数量的广告,设计所需租用的最少数量的广告牌. 其实就是区间选点问题:数轴上有n个区间[ai, bi],取尽量少的点,使得每一个区间都至少有一个点.首先对区间 ...

  10. 【蓝牙数据采集模块】-02-Sensor Controller 编写CC2650STK外设驱动

    上次说到把所有的传感器模块在Sensor Controller中实现读写,并封装驱动. 先来看一下CC2650STK的原理图 用红色方框标记的DIO_0~DIO_7, DIO_23~DIO_30是可以 ...