gpt4 book ai didi

javascript - 如何使用生命周期方法 getDerivedStateFromProps 而不是 componentWillReceiveProps

转载 作者:IT王子 更新时间:2023-10-29 02:40:26 26 4
gpt4 key购买 nike

看起来 componentWillReceiveProps 将在即将发布的版本中完全淘汰,取而代之的是新的生命周期方法 getDerivedStateFromProps:static getDerivedStateFromProps() .

经过检查,您现在似乎无法在 this.propsnextProps 之间进行直接比较,就像您可以在 componentWillReceiveProps。有什么办法解决这个问题吗?

此外,它现在返回一个对象。我假设返回值本质上是 this.setState 是否正确?

下面是我在网上找到的一个例子:State derived from props/state .

之前

class ExampleComponent extends React.Component {
state = {
derivedData: computeDerivedState(this.props)
};

componentWillReceiveProps(nextProps) {
if (this.props.someValue !== nextProps.someValue) {
this.setState({
derivedData: computeDerivedState(nextProps)
});
}
}
}

之后

class ExampleComponent extends React.Component {
// Initialize state in constructor,
// Or with a property initializer.
state = {};

static getDerivedStateFromProps(nextProps, prevState) {
if (prevState.someMirroredValue !== nextProps.someValue) {
return {
derivedData: computeDerivedState(nextProps),
someMirroredValue: nextProps.someValue
};
}

// Return null to indicate no change to state.
return null;
}
}

最佳答案

关于 componentWillReceiveProps 的移除:您应该能够通过 getDerivedStateFromPropscomponentDidUpdate 的组合来处理它的使用,参见 the React blog post例如迁移。是的,getDerivedStateFromProps 返回的对象更新状态类似于传递给 setState 的对象。

如果你真的需要一个 prop 的旧值,你总是可以用这样的东西将它缓存在你的状态中:

state = {
cachedSomeProp: null
// ... rest of initial state
};

static getDerivedStateFromProps(nextProps, prevState) {
// do things with nextProps.someProp and prevState.cachedSomeProp
return {
cachedSomeProp: nextProps.someProp,
// ... other derived state properties
};
}

任何不影响状态的东西都可以放在 componentDidUpdate 中,对于非常底层的东西甚至还有一个 getSnapshotBeforeUpdate

更新:为了感受新的(和旧的)生命周期方法,react-lifecycle-visualizer包可能会有帮助。

关于javascript - 如何使用生命周期方法 getDerivedStateFromProps 而不是 componentWillReceiveProps,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49617486/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com