在 React 中,在哪里设置状态取决于之前和当前的道具?

Where to set state, dependent on previous and current props, in React?

我正在使用 componentWillReceiveProps 生命周期事件来启用或禁用到下一页的转换。现在这个事件改成了UNSAFE_componentWillReceiveProps,我觉得我不应该再用它了,但是我找不到明显的替代品。

组件的位置来自 props.location.pathname,所以我需要一个事件,我可以在其中访问上一个和下一个道具,然后根据是否应该设置组件的初始外观是否过渡,但是:

我想我可以保存以前的路径名并在下次 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
    }
}