jsx语法->createElement()->React元素 父组件更新,子组件跟着更新. # 组件优化 ### 减轻state,与渲染无关的不要放在state中. ### 避免不必要的重新渲染. 钩子函数 shouldComponentUpdate(nextProps,nextState) 根据返回值判断是否需要渲染该值. 触发时机:更新阶段的钩子函数,组件重新渲染前执行(shouldComponentUpdate->render) 或者使用纯组件 ```html class StateApp extends React.Component{ constructor(){ super() this.state= { count:0 } } shouldComponentUpdate(nextProps,nextState){ console.info('最新是内容'+nextState.count) console.info('上次是内容'+this.state.count) return nextState.count!==this.setState.count } onIncrement=()=>{ console.info('事件处理this'+this) this.setState((state,props)=> { return { count:state.count+1 } }) console.info(this.state.count) } render(){ return (
有状态组件,{this.state.count}
) } } ``` ## 纯组件 PureComponent 比较props和state,只有这两者变化才会更新. 纯组件内部的对比是shallow compare 浅层对比 对于引用类型来说:只比较对象地址. # 虚拟DOM和Diff算法 虚拟DOM=state+jsx 虚拟DOM:本质上就是一个js对象,用来描述你希望在屏幕上看到的内容(UI) 虚拟DOM让react脱离了浏览器的束缚 ## diff算法 1. 初次渲染是,React会根据初始state(Model),创建一个虚拟DOM对象(树) 2. 根据虚拟DOM生成真正的DOM,渲染到页面中 3. 当数据变化后(setState),重新根据新的数据,创建新的虚拟DOM对象树 4. 与上一次得到的虚拟DOM对象,使用Diff算法对比(找不同),得到需要更新的内容 5. 最终,React只将变化的内容(patch)到DOM中,重新渲染到页面.