Roof 是一个简单的前端应用框架,它能帮助你把页面上的数据和逻辑有效地管理起来。下图是它标准的调用过程。
面我们来简单写一段代码把它跑起来。环境推荐使用 antd :
bash
npm install antd-bin -g
mkdir roof-demo && cd roof-demo
antd init
npm install
npm install roof --save
antd server
antd 会自动帮我们把组件挂载到页面上,我们只需要关注组件就好了。 下面我们来创建一个 Roof 应用:
修改 `/src/component/App.jsx`为:
javascript
import React from 'react';
import Roof from 'roof';
import _ from 'roof/addon/react/container';
import User from './User';
import UserDataFactory from '../data/user';
import UserListenerFactory from '../event/user';
const App = Roof.createRootContainer({
//告诉 Roof 应用的数据如何创建
data: {
user: UserDataFactory
},
//告诉 Roof 应用的事件和监听器信息
events: {
user: UserListenerFactory
},
render(){
return <div>
<div>Hello :</div>
<User />
</div>
}
})
export default App;
这样一个基本的 Roof 应用就已经创建好了。 然后来定义应用数据 user `/data/user.js`,Roof 使用了非常接近传统**面向对象概念**的方式来定义数据:
javascript
import Roof from 'roof';
const User = Roof.Node.createClass({
getFullName(){
return this.get('name') + ' ' + this.get('family')
}
})
export default function UserFactory(){
return new User({
name:'Jane',
family : 'Smith',
age : 17
})
}
用图更好理解:
这样一个完整数据就定义好了,接下里定义事件和事件的监听器。事件本质是字符串。事件的监听器则是对象,它的 `fn` 属性必须定义一个函数作为触发事件时执行的函数。在 Roof 的事件定义文件中,我们可以直接使用函数来代替监听器对象,Roof 会帮我们转化。
`/src/event/user.js` :
javascript
export default function addAgeToUser(data) {
return {
'user.addAge': function ( ageToAdd ) {
const user = data.get('user')
const age = user.get('age')
user.set('age', age + ageToAdd)
}
}
}
最后,我们来定义一个组件显示数据,同时能够触发事件让数据改变, `/src/component/User.jsx` :
javascript
import React from 'react';
import Roof from 'roof';
const User = Roof.createContainer({
cursors : {
user : 'user'
},
addAge(){
this.bus.fire('user.addAge', 2)
},
render(){
return <div>
<div>{this.props.user.getFullName()}</div>
<a onClick={this.addAge}>add 2 to age</a>
</div>
}
})
export default User;