背景

在 React 中,只要父组件更新了,子组件不管是否发生变化都要更新。每一个组件都有一个默认 SCU 生命周期。

shouldComponentUpdate(nextProps, nextState) {
  return true;
}

基本使用

在下面的代码中,我通过深度比较 list,如果两个 list deepEqual,则渲染组件。

shouldComponentUpdate(nextProps, nextState) {
  // _.isEqual 做对象或者数组的深度比较(一次性递归到底)
  if (_.isEqual(nextProps.list, this.props.list)) {
  // 相等,则不重复渲染
    return false;
  }
  return true; // 不相等,则渲染
}

如果不配合state不可变值规范去写,比如下面的代码

this.state.list.push({
  id: `id-${Date.now()}`,
  title,
});
this.setState({
  list: this.state.list,
});

我们先对 state.list 进行了 push 操作,此时 list 内容已经发生了变化。而 shouldComponentUpdatesetState 后才会触发,这里就会导致,isEqual 下的 list,不论怎样都相等。正确的用法应该按照不可变值规范去写。

// 正确的用法
this.setState({ 
  list: this.state.list.concat({
	id: `id-${Date.now()}`,
	title,
  }),
});