[!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的应用场景vue
js ReactDOM.render(<App/>, container)
会触发patch(vNode, newVNode)node
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]react
- setState经过一个队列机制实现state更新,当执行setState时,会将须要更新的state很后放入状态队列,而不会当即更新this.state,队列机制能够高效地批量更新state。若是不经过setState而直接修改this.state的值
- 那么该state将不会被放入状态队列中。当下次调用setState并对状态队列进行合并时,就会忽略以前修改的state,形成不可预知的错误
- 同时,也利用了队列机制实现了setState的异步更新,避免了频繁的重复更新state
并不妨碍二者都能实现相同的功能jquery
“开放封闭原则”npm
组件化更适合选择Reactredux
都是数据驱动视图后端
若是团队水平较高,推荐使用React,组件化和JSX浏览器