componentDidUpdate 中的 prevState 是 currentState 吗?

IT技术 reactjs react-native state
2021-05-09 04:37:17

我过去使用componentDidUpdate()过,它按预期工作。

然而这一次,我做到了

componentDidUpdate(prevProps, prevState) {
    if (prevState.object.someString !== this.state.object.someString) {
        console.log(true);
    }
}

并且true从不记录。我将两个状态对象都记录到控制台,发现它们完全相同:当前状态。

这是一个错误吗?我在这里错过了什么?

谢谢你。

编辑:我componentWillUpdate(nextProps, nextState)一次又一次地尝试做同样的事情,它们是同一个对象。

编辑 2:我正在通过执行以下操作来更改状态:

modifyObject = (field, value) => {
    const { object } = this.state;
    object[field] = value;
    this.setState({ object });
}
3个回答

在添加的代码中,您只是通过更改对象上的属性来改变引用对象。这意味着最终nextPropspreviousProps本质上指的是同一个引用。

因此,您componentDidUpdate没有发现差异也就不足为奇了。

您应该做的是创建对象的新版本,并使用该版本来设置状态,例如:

this.setState({ object: { ...object, [field]: value } })

或者如果您没有传播运算符,例如

this.setState( { object: Object.assign({}, object, { [field]: value }) } );

注意:

如果 shouldComponentUpdate() 返回 false,则不会调用 componentDidUpdate()。 参考:https : //reactjs.org/docs/react-component.html#componentdidupdate

 shouldComponentUpdate(nextProps, nextState) {
    if (this.state.someString !== nextState.someString) {
      return true;
    }
    return false;
  }

componentDidUpdate(prevProps, prevState) {
    if (prevState.someString !== this.state.someString) {
        console.log(true);
    }
}

在某些情况下,最好使用 lodash isEqual 之类的方法来深入比较您使用时的状态/propsshouldComponentUpdate

shouldComponentUpdate(nextProps, nextState) {
        return !isEqual(this.state, nextState);
      }

如果您有复杂的props/状态,这将提高您的性能,因为不会发生浪费的渲染

感谢 Icepickle 的评论,解决了问题。

而不是做

modifyObject = (field, value) => {
    const { object } = this.state;
    object[field] = value;
    this.setState({ object });
}

我做了

modifyObject = (field, value) => {
    const { object } = this.state;
    this.setState({ object: { ...object, [field]: value } });
}

再次感谢。