react在setState的时候,大致需要经过以下几点:
更新state->创建新的VNode->diff算法对比差异->渲染
以上过程会触发 四个钩子函数:
shouldComponentUpdate、componentWillUpdate、render、componentDidUpdate
- 其中,若子组件依赖于父组件,还会执行个钩子函数:componentWillReceiveProps。
- 关于同步异步问题,首先需要了解到,react控制的事件和其生命周期中调用setState时,不会同步更新state的。而react之外的,如原生js的事件,调用setState时是同步的。
- 判断同步异步时,是根据一个变量isBatchingUpdate判断的,这个变量是个布尔值,默认为false,表示同步更新。为true时表示放到队列里延时更新。
- 在React调用事件处理函数时,会先调用一个函数batchedUpdate将变量isBatchingUpdate的值修改为true,这样React控制的事件处理过程setState就不会同步更新this.state。
- 而setState的异步,也有个坏处,它会引起一些不必要的渲染,解决方法是可以通过shouldComponentUpdate来进行判断减少不必要的渲染,也可以通过PureComponent来减少不必要的渲染。