Omi框架彻底基于组件体系设计,咱们但愿开发者能够像搭积木同样制做Web程序,一切皆是组件,组件也能够嵌套子组件造成新的组件,新的组件又能够看成子组件嵌套至任意组件造成新的组件...html
这里使用Todo的例子来说解Omi组件体系的使用。git
class Todo extends Omi.Component { constructor(data) { super(data); } add (evt) { evt.preventDefault(); this.data.items.push(this.data.text); this.data.text = ''; this.update(); } style () { return ` h3 { color:red; } button{ color:green;} `; } handleChange(target){ this.data.text = target.value; } render () { return `<div> <h3>TODO</h3> <ul> {{#items}} <li>{{.}}</li> {{/items}}</ul> <form onsubmit="add(event)" > <input type="text" onchange="handleChange(this)" value="{{text}}" /> <button>Add #{{items.length}}</button> </form> </div>`; } } Omi.render(new Todo({ items: [] ,text : '' }),"body");
组件生成的HTML最终会插入到body中。上面的例子展现了Omi的部分特性:github
这里须要特别强调的是,为了更加的自由和灵活度。Omi没有内置数据变动的自动更新,须要开发者本身调用update方法。
你也能够和oba或者mobx一块儿使用来实现自动更新。web
[点击这里->在线试试]npm
若是页面超级简单的话,能够没有组件嵌套。可是绝大部分Web网页或者Web应用,须要嵌套定义的组件来完成全部的功能和展现。好比上面的Todo,咱们也是能够抽取出List。
这样让程序易维护、可扩展、方便复用。如,咱们抽取出List:框架
class List extends Omi.Component { constructor(data) { super(data); } render () { return `<ul> {{#items}} <li>{{.}}</li> {{/items}}</ul>`; } }
怎么使用这个List?咱们须要使用Omi.makeHTML把List制做成能够声明式的标签,在render方法中就能直接使用该标签。以下所示:组件化
import List from './list.js'; Omi.makeHTML('List', List); class Todo extends Omi.Component { constructor(data) { super(data); this.data.length = this.data.items.length; this.listData = { items : this.data.items }; } add (evt) { evt.preventDefault(); this.list.data.items.push(this.data.text); this.data.length = this.list.data.items.length; this.data.text = ''; this.update(); } style () { return ` h3 { color:red; } button{ color:green;} `; } handleChange(target){ this.data.text = target.value; } render () { return `<div> <h3>TODO</h3> <List name="list" data="listData" /> <form onsubmit="add(event)" > <input type="text" onchange="handleChange(this)" value="{{text}}" /> <button>Add #{{length}}</button> </form> </div>`; } }
须要注意的是,父组件的this.listData会被经过Object.assign浅拷贝到子组件。
这样作的目的主要是但愿之后DOM的变动都尽可能修改子组件自身的data,而后再调用其update方法,而不是去更改父组件的listData。this
关于Omi组件通信其实有4种方案,这个后续教程会专门来说。设计
点击这里→在线试试code