标签:缺点 ddt todo zha 项目 create 结果 视图 data
[!NOTE]
- JSX语法(标签、JS表达式,判断,循环,事件绑定)
- JSX是语法糖, 需要被解析成JS才能运行(h函数的使用)
- JSX是独立的标准,可以被其他项目使用
// 下面的代码实际执行流程:
// JSX 代码
const user = {
firstName : 'xiugang',
lastName : 'zhang'
}
var profile = <div>
<img src="a.jpg" className='profile'/>
<h3>{[user.firstName, user.lastName].join(' ')}</h3>
</div>
// 解析结果(重点掌握),关键点:是使用了一个React.createElement来创建节点的
var profile = React.createElement('div', null, [
React.createElement('img', {src : 'a.jpg', className : 'profile'}),
React.createElement('h3', null, [[user.firstName, user.lastName].join(' ')])
])
/* @jsx h*/
// 1. 使用插件:cnpm install babel-plugin-transform-react-jsx
// 2. 开始编译JSX: babel --plugins transform-react-jsx demo.js
// 3. 可以自定义React.createElement变为一个h函数: /* @jsx h*/
正好符合VDOM的应用场景
js ReactDOM.render(<App/>, container)
会触发patch(vNode, newVNode)
React.createElement(TodoInput, { addTitle: this.addTitle.bind(this) }),
React.createElement(TodoList, { data: this.state.list })
// 上面的代码相当于是先去创建一个TodoList实例对象
var list = new TodoList({ data: this.state.list });
// 然后再去调用这个函数的render方法(返回的是一个JSX,然后对当前的这个JSX渲染为VDOM)
var vnode = list.render();
// 1. 每个组件实例,都有renderComponent方法
class Component {
constructor(){
}
// 每个组件都有这个函数
renderComponent(){
// 获取上一次的vNode
const prevVnode = this._vnode;
// render函数只需之后,得到的还是一个新的node
const newVnode = this.render();
// 开始对比,找出差异
patch(prevVnode, newVnode);
// 更新node为最新的node
this._vnode = newVnode;
}
}
// 2. 执行renderComponent会重新执行实例的render方法
// 3. render函数返回newVnode,然后拿到prevNode(也就是上次的vnode)----多次执行setState视图最终也只会渲染一次
// 4. 执行patch(preVnode, newVNode)
[!NOTE]
- setState通过一个队列机制实现state更新,当执行setState时,会将需要更新的state很后放入状态队列,而不会立即更新this.state,队列机制可以高效地批量更新state。如果不通过setState而直接修改this.state的值
- 那么该state将不会被放入状态队列中。当下次调用setState并对状态队列进行合并时,就会忽略之前修改的state,造成不可预知的错误
- 同时,也利用了队列机制实现了setState的异步更新,避免了频繁的重复更新state
并不妨碍两者都能实现相同的功能
“开放封闭原则”
组件化更适合选择React
都是数据驱动视图
如果团队水平较高,推荐使用React,组件化和JSX
标签:缺点 ddt todo zha 项目 create 结果 视图 data
原文地址:https://www.cnblogs.com/fecommunity/p/11922109.html