Omi原理-Hello Omi
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的更多相关文章
- Omi原理-环境搭建
环境搭建 Omi框架使用 Webpack + ES6 的方式去开发:使用karma+jasmine来作为Omi的测试工具. Karma介绍 Karma是一个基于Node.js的JavaScript测试 ...
- Omi框架学习之旅 - 插件机制之omi-router及原理说明
先来看看官网的介绍吧:https://github.com/AlloyTeam/omi/tree/master/plugins/omi-router 其实我推荐直接看官网的介绍.我所写的,主要给个人做 ...
- Omi框架学习之旅 - 插件机制之omi-touch 及原理说明
这个插件也能做好多好多的事,比如上拉下拉加载数据,轮播,等一切和运动有关的特效. 具体看我的allowTouch这篇博客,掌握了其用法,在来看它是怎么和omi结合的.就会很简单. 当然使用起来也比较方 ...
- 2017年试试Web组件化框架Omi
Open and modern framework for building user interfaces. Omi的Github地址https://github.com/AlloyTeam/omi ...
- Omi教程-通讯通讯攻略大全
组件通讯 Omi框架组建间的通讯非常遍历灵活,因为有许多可选方案进行通讯: 通过在组件上声明 data-* 传递给子节点 通过在组件上声明 data 传递给子节点 (支持复杂数据类型的映射) 父容器设 ...
- Omi教程-生命周期和事件处理
生命周期 名称 含义 时机 constructor 构造函数 new的时候 install 初始化安装,这可以拿到用户传进的data进行处理 实例化 installed 安装完成,HTML已经插入页面 ...
- Omi实战-QQ附近用户列表Web页
原文地址https://github.com/AlloyTeam/omi/blob/master/docs/cn_pr_nearby.md 写在前面 Omi很适合大型复杂的Web页面开发,例如一些We ...
- Omi v1.0震撼发布 - 令人窒息的Web组件化框架
原文链接--https://github.com/AlloyTeam/omi 写在前面 Omi框架经过几十个版本的迭代,越来越简便易用和强大. 经过周末的连续通宵加班加点,Omi v1.0版本终于问世 ...
- Omi v1.0.2发布 - 正式支持传递javascript表达式
原文地址:https://github.com/AlloyTeam/omi/ 写在前面 Omi框架可以通过在组件上声明 data-* 把属性传递给子节点. Omi从设计之初,就是往标准的DOM标签的标 ...
随机推荐
- 最简单的ajax调用webservice
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="TestHelloWorld ...
- javascript模拟鼠标双击事件
通常我们在做开发的时候需要通过单击切换对立事件,简单做了一个模型. <!DOCTYPE html> <html> <head> <title>javas ...
- 增量式PID的stm32实现(转)
源:增量式PID的stm32实现,整定过程 首先说说增量式PID的公式,这个关系到MCU算法公式的书写,实际上两个公式的写法是同一个公式变换来得,不同的是系数的差异. 资料上比较多的是: 还有一种是: ...
- 【spoj8222】 Substrings
http://www.spoj.com/problems/NSUBSTR/ (题目链接) 题意 给出一个字符串S,令${F(x)}$表示S的所有长度为x的子串出现次数的最大值.求${F(1)..... ...
- Tsinsen-A1489 抽奖 【数学期望】
乔明达太神,其实已经题解非常清楚了,我再推一遍吧. 题目意思相当于有n个盒子,无差别投m次球,每个盒子的得分为每个盒子里的球的个数. 第一问: 假设这个球放在了第i个盒子里,那么 ∆ans = (mi ...
- python 错误AttributeError: 'module' object has no attribute 'AF_INET'
写了一个简单的python socket的程序.运行时,报错如下 原因:文件的命名与Python的function的命名冲突 修改名称后,发现还是无法运行,检查目录下面是否有 这样子的一个文件,删除即 ...
- Java web入门
1.java 设计模式:http://blog.csdn.net/JAVE_LOVER/article/category/2379703 2.Java web框架的思考:http://www.osch ...
- FlexGrid简单demo
1.首先加入以下代码 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <hea ...
- C#常用网址
C# 编程指南 https://msdn.microsoft.com/zh-cn/library/67ef8sbd.aspx
- C# .NET中的 反射的应用
C#中的映射 C#编译后的文件主要由IL代码和元数据组成,元数据为.NET组件提供了丰富的自描述特性,它使得我们可以在代码运行时获知组件中的类型等重要的信息.C#中这是通过一种称作映射(Reflect ...