<Page showSummary={false}>

  <div style={{'text-align':'center','margin':'0  0 80px'}}>
    <img src='/assets/images/Roof-text.svg'/>
  </div>


  <p>Roof 是一个简单的前端应用框架，它能帮助你把页面上的数据和逻辑有效地管理起来。下图是它标准的调用过程。</p>

  <div style={{'text-align':'center','margin':'50px'}}>
    <img src='/assets/images/render_cycle.svg' height="250px"/>
  </div>

  <p>面我们来简单写一段代码把它跑起来。环境推荐使用 antd :</p>

  <Code type='bash'>{`
npm install antd-bin -g
mkdir roof-demo && cd roof-demo
antd init
npm install
npm install roof --save
antd server
`}</Code>

  <p>antd 会自动帮我们把组件挂载到页面上，我们只需要关注组件就好了。
    下面我们来创建一个 Roof 应用:</p>


  <p>修改 `/src/component/App.jsx`为:</p>

  <Code type='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;
`}</Code>

  <p>这样一个基本的 Roof 应用就已经创建好了。
    然后来定义应用数据 user `/data/user.js`，Roof 使用了非常接近传统**面向对象概念**的方式来定义数据:</p>

  <Code type='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
  })
}
`}</Code>

  <p>用图更好理解：</p>

  <div style={{'text-align':'center','margin':'50px'}}>
    <img src='/assets/images/data_inheritance.svg' height="250px"/>
  </div>

  <p>这样一个完整数据就定义好了，接下里定义事件和事件的监听器。事件本质是字符串。事件的监听器则是对象，它的 `fn` 属性必须定义一个函数作为触发事件时执行的函数。在 Roof
    的事件定义文件中，我们可以直接使用函数来代替监听器对象，Roof 会帮我们转化。</p>

  <p>`/src/event/user.js` :</p>

  <Code type='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)
    }
  }
}

`}</Code>

  <p>最后，我们来定义一个组件显示数据，同时能够触发事件让数据改变, `/src/component/User.jsx` :</p>

  <Code type='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;
`}</Code>

  <p>恭喜，Roof 入门完成！<a href='http://gitlab.alipay-inc.com/roof/roof-naive-demo'>查看完整代码仓库</a>。或者<a
    href='/pages/tutorial/index.html'>继续阅读教程</a>。</p>

</Page>




