Skip to content

React 性能优化相关

使用生产环境版本的库

避免不必要的渲染

React 生命周期提供了 shouldComponentUpdate 方法,默认返回 true,若返回 false,组件此次的更新将停止。我们可以把该方法作为钩子,在该方法中根据组件自身业务逻辑决定返回 true 还是 false。如下:

jsx
class MyComponent extends Component {
  shouldComponentUpdate(nextProps, nextState) {
    if (nextProps.item === this.props.item) {
      return false;
    }
    return true;
  }
}

React 还提供了一个 PureComponent 组件,该组件会使用浅比较来比较新旧 props 和 state,因此可以通过让组件继承 PureComponent 来替代手写 shouldComponentUpdate 的逻辑。但是,使用浅比较很容易因为直接修改数据而产生错误

jsx
class NumberList extends PureComponent {
  constructor() {
    super();
    this.state = {
      numbers: [1, 2, 3, 4],
    };
  }
  handleClick = () => {
    const numbers = this.state.numbers;
    numbers.push(numbers[numbers.length - 1] + 1);
    this.setState({
      numbers,
    });
  };
  render() {
    return (
      <div>
        <button onClick={this.handleClick}>add</button>
        {this.state.numbers.map(item => (
          <div>{item}</div>
        ))}
      </div>
    );
  }
}

点击 Button, NumberList 并不会重新调用 render,因为 handleClick 中是直接修改 this.state.numbers 这个数组的 this.state.numbers 的引用在 setState 前后没有改变,所以 shouldComponentUpdate 会返回 false。

使用 key


本章介绍了虚拟 DOM 机制以及用于虚拟 DOM 比较的 Diff 算法,虚拟 DOM 是 React 应用高效运行的基础。

共 20 个模块,1301 篇 Markdown 文档。