父子组件的渲染关系
示例代码虽然
点击change按钮后,
Panel
ClickCount
Test
都执行render,
- 即使 修改了与
Panel
渲染无关的数据- 即使 传入
ClickCount
的props没有变化- 即使 没有传入
Test
props
但是
所有的组件和元素都render完成 ===> 执行diff算法 ===> 修改有差异的dom。
所以
虽然执行了很多无用的render,但都是在js里执行的,和真正的dom操作之间还有一层diff算法,他帮助我们节省了大部分dom操作的性能。
render优化
虽然上述的好多无用的render执行,不是特别耗费性能,但能避免当然最好,所以react 生命周期中
shouldComponentUpdate
排上了用场。
- 可以判断当前的state和props以及更新后的state和props是否有变化,来决定是否render这次更新,来避免无用的render。当然上述操作,只要我们
class Panel extends PureComponent {}
PureComponent就已经帮我们做好了。 - 在定义当前组件为
PureComponent
时,我们需要考虑当前的组件更新是否频繁:因为如果注定当前组件每次更新肯定会有所变化,那PureComponent是否更新的判断反而成为无用的。