我正在使用componentWillReceiveProps
生命周期事件来启用或禁用到下一页的转换。现在该事件已更改为UNSAFE_componentWillReceiveProps
,我觉得我不再应该使用它,但是我找不到它的明显替代品。
组件的位置来自props.location.pathname
,所以我需要一个事件,在该事件中,我可以访问上一个和下一个道具,然后根据是否应该进行过渡来设置组件的初始外观还是不行,
getDerivedStateFromProps
仅可使用以前的道具。shouldComponentUpdate
用来告诉组件是否应该更新,这不是我们想要的,所以出来了。render
没有以前的道具。getSnapshotBeforeUpdate
将参数传递给componentDidUpdate
,此时组件已被渲染,因此无法设置初始外观。我想我可以保存先前的路径名,并在render
中下次使用它,但这似乎不是一个很好的解决方案。在这种情况下,最佳做法是什么?
答案 0 :(得分:1)
您可以在下面使用这是安全的,并由Reactjs推荐
componentDidUpdate(prevProps) {
if (this.props.userID !== prevProps.userID) {
this.fetchData(this.props.userID);
}
}
答案 1 :(得分:1)
您说
getDerivedStateFromProps only has access to the previous props.
但是getDerivedStateFromProps可以访问下一个道具和上一个状态
我同意保存前一个路径名看起来不太好,但是这里提供了另一种选择:https://codesandbox.io/s/rjyvp7l3rq在https://reactjs.org/blog/2018/06/07/you-probably-dont-need-derived-state.html中找到。
看看uncontrolEmailInput组件如何将上一个道具保存为状态
state = {
email: this.props.defaultEmail,
prevPropsUserID: this.props.userID
};
static getDerivedStateFromProps(props, state) {
// Any time the current user changes,
// Reset any parts of state that are tied to that user.
// In this simple example, that's just the email.
if (props.userID !== state.prevPropsUserID) {
return {
prevPropsUserID: props.userID,
email: props.defaultEmail
};
}
return null;
}
这是一篇有关新生命周期的精彩文章:https://medium.com/@baphemot/understanding-react-react-16-3-component-life-cycle-23129bc7a705
答案 2 :(得分:0)
根据react文档,您应该使用componentDidUpdate。它可以访问prevProps,prevState和当前props,this.props,this.state中的状态。
看一下文档 https://reactjs.org/docs/react-component.html#componentdidupdate
componentDidUpdate(prevProps) {
if(this.props.pathname !== prevProps.pathname) {
//do something here or setState to adjust the appearance accordingly
}
}