React开发之——组件性能优化(21)
一 概述
- 性能优化——减轻 state
- 性能优化——避免不必要的重新渲染
- 性能优化——纯组件
二 性能优化——减轻 state
2.1 使用说明
- 减轻 state:只存储跟组件渲染相关的数据(比如:count / 列表数据 / loading 等)
- 注意:不用做渲染的数据不要放在 state 中,比如定时器 id等
- 对于这种需要在多个方法中用到的数据,应该放在 this 中
2.2 减轻state示例
1 | class Hello extends Component { |
三 性能优化——避免不必要的重新渲染
3.1 使用说明
- 组件更新机制:父组件更新会引起子组件也被更新,这种思路很清晰
- 问题:子组件没有任何变化时也会重新渲染
- 如何避免不必要的重新渲染呢?
- 解决方式:使用钩子函数 shouldComponentUpdate(nextProps, nextState)
- 作用:通过返回值决定该组件是否重新渲染,返回 true 表示重新渲染,false 表示不重新渲染
- 触发时机:更新阶段的钩子函数,组件重新渲染前执行 (shouldComponentUpdate render)
3.2 shouldComponentUpdate示例
1 | shouldComponentUpdate(nextProps, nextState) { |
说明:
- 返回false,阻止组件重新渲染
- 返回true,组件重新渲染
- 最新的状态:nextState
- 更新前的状态:this.state
3.3 案例随机数(比较state)——数值相同不重新渲染
1 | class App extends React.Component { |
3.4 案例随机数(比较props)——数值相同不重新渲染
1 | class App extends React.Component { |
四 性能优化——纯组件
4.1 纯组件使用说明
- 纯组件:PureComponent 与 React.Component 功能相似
- 区别:PureComponent 内部自动实现了 shouldComponentUpdate 钩子,不需要手动比较
- 原理:纯组件内部通过分别 对比 前后两次 props 和 state 的值,来决定是否重新渲染组件
4.2 纯组件示例
1-子组件使用纯组件
1 | class NumberBox extends React.PureComponent { |
2-父组件使用纯组件
1 | class App extends React.PureComponent { |
4.3 纯组件shallow compare
使用说明:
- 说明:纯组件内部的对比是 shallow compare(浅层对比)
- 对于值类型来说:比较两个值是否相同(直接赋值即可,没有坑)
示例代码
1-基本数据类型
1 | let number = 0 |
2-值类型
1 | const newObj = { ...this.state.obj, number: Math.floor(Math.random() * 3) } |