在 React 中,在哪里设置状态取决于之前和当前的道具?
Where to set state, dependent on previous and current props, in React?
我正在使用 componentWillReceiveProps
生命周期事件来启用或禁用到下一页的转换。现在这个事件改成了UNSAFE_componentWillReceiveProps
,我觉得我不应该再用它了,但是我找不到明显的替代品。
组件的位置来自 props.location.pathname
,所以我需要一个事件,我可以在其中访问上一个和下一个道具,然后根据是否应该设置组件的初始外观是否过渡,但是:
getDerivedStateFromProps
只能访问之前的道具
shouldComponentUpdate
应该用来告诉组件是否应该更新,这不是我们想要的,所以它被淘汰了。
render
没有之前的道具
getSnapshotBeforeUpdate
传参给componentDidUpdate
,此时组件已经渲染完毕,无法设置初始外观
我想我可以保存以前的路径名并在下次 render
中使用它,但这似乎不是一个优雅的解决方案。这种情况下的最佳做法是什么?
您可以使用以下安全且 Reactjs 推荐的
componentDidUpdate(prevProps) {
if (this.props.userID !== prevProps.userID) {
this.fetchData(this.props.userID);
}
}
你说
getDerivedStateFromProps only has access to the previous props.
但是 getDerivedStateFromProps 可以访问下一个道具和上一个状态
保存以前的路径名可能看起来不太优雅,我同意,但它是这里提供的替代方法:https://codesandbox.io/s/rjyvp7l3rq found here https://reactjs.org/blog/2018/06/07/you-probably-dont-need-derived-state.html。
看看 uncontrolledEmailInput 组件在状态中保存 prev props
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
根据 React 文档,您应该使用 componentDidUpdate。它可以访问 prevProps、prevState 和当前道具,在 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
}
}
我正在使用 componentWillReceiveProps
生命周期事件来启用或禁用到下一页的转换。现在这个事件改成了UNSAFE_componentWillReceiveProps
,我觉得我不应该再用它了,但是我找不到明显的替代品。
组件的位置来自 props.location.pathname
,所以我需要一个事件,我可以在其中访问上一个和下一个道具,然后根据是否应该设置组件的初始外观是否过渡,但是:
getDerivedStateFromProps
只能访问之前的道具shouldComponentUpdate
应该用来告诉组件是否应该更新,这不是我们想要的,所以它被淘汰了。render
没有之前的道具getSnapshotBeforeUpdate
传参给componentDidUpdate
,此时组件已经渲染完毕,无法设置初始外观
我想我可以保存以前的路径名并在下次 render
中使用它,但这似乎不是一个优雅的解决方案。这种情况下的最佳做法是什么?
您可以使用以下安全且 Reactjs 推荐的
componentDidUpdate(prevProps) {
if (this.props.userID !== prevProps.userID) {
this.fetchData(this.props.userID);
}
}
你说
getDerivedStateFromProps only has access to the previous props.
但是 getDerivedStateFromProps 可以访问下一个道具和上一个状态
保存以前的路径名可能看起来不太优雅,我同意,但它是这里提供的替代方法:https://codesandbox.io/s/rjyvp7l3rq found here https://reactjs.org/blog/2018/06/07/you-probably-dont-need-derived-state.html。
看看 uncontrolledEmailInput 组件在状态中保存 prev props
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
根据 React 文档,您应该使用 componentDidUpdate。它可以访问 prevProps、prevState 和当前道具,在 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
}
}