shouldComponentUpdate(SCU)

  1. shouldComponentUpdate(nextProps, nextState) {
  2. if (nextState.count !== this.state.count) {
  3. return true; // 可以渲染
  4. }
  5. return false; // 不重复渲染
  6. }

默认值返回的是 true。
React默认:父组件有更新,子组件则无条件更新 <=> SCU 默认返回一个 true
性能优化对于 React 更加重要
SCU 一定要每次都用么?—— 不一定,需要的时候才优化

  1. shouldComponentUpdate(nextProps, nextState) {
  2. if (_.isEqual(nextProps.list, this.props.list)) {
  3. return false;
  4. }
  5. return true;
  6. }
  7. // 假设使用了错误的更新方法
  8. this.state.list.push('some string');
  9. this.setState({
  10. list: this.state.list
  11. })
  12. // 立马就会出现bug,组件就不会渲染了
  13. // react 为了避免错误写法导致 BUG,默认SCU是true

scu 一定要配合 不可变值 使用

PureComponent 和 React.memo

  • PureComponent , SCU中实现了浅比较
  • memo,函数组件中的 PureComponent
  • 浅比较已可覆盖大部分情况(尽量不要做深度比较)

    1. class Demo extends React.PureComponent {}
    2. // 类似于
    3. class Demo extends React.Component {
    4. shouldComponentUpdate() {/*做了浅比较*/}
    5. }

    immutable.js

  • 彻底拥抱 不可变值

  • 基于共享数据(不是深拷贝),速度好
  • 有一定的学习和迁移成本,按需使用 ```jsx import Immutable from ‘immutable’; const map1 = Immutable.Map({a:1, b:2}); const map2 = map1.set(‘b’, 50);

map1.get(‘b’); // 2 map2.get(‘b’); // 50 ```