如何在React Native应用程序中替换componentWillReceiveProps?

时间:2019-05-11 06:22:43

标签: reactjs react-native

我听说componentWillRecieveProps生命周期方法不是在React Native项目中使用的好方法,而是使用getDerivedStateFromProps。 所以我尝试用getDerivedStateFromProps替换我的componentWillRecieveProps。但是我不知道要这么做,我尝试使用componentDidUpdate()但它反复调用setstate。

  componentWillReceiveProps(nextProps) {

  if(nextProps.shopList.isFetching===false) {
        this.setState({isLoading:false})
    if(!_.isEqual(nextProps.shopList, this.props.shopList) && nextProps.shopList.error===false ) {
       this.formatShops(nextProps.shopList.shops)
     } else {

    }
  } else {
    this.setState({isLoading:true})
  }


  if(nextProps.common.isFetching===false) {

    this.setState({isLoading:false})
    if(nextProps.common.error===false) {
      if(!_.isEqual(nextProps.common, this.props.common) && nextProps.common.error===false ) {
       if(nextProps.common.otpverifysucess==false) {
            this.props.navigation.dispatch(logoutAction);
      }
     }
    }
  }
  }

这是我的整个组件WillRecieveProps。任何人都可以将其移动到getDerivedStateFromProps生命周期方法中

1 个答案:

答案 0 :(得分:1)

想法是,将所有状态更新部分放在getDerivedStateFromProps方法中,并将所有基于新道具和旧道具值之间的差异的动作放在componentDidUpdate方法中。 componentDidUpdate将获得prevProps值作为参数,而this.props将具有新的props值。

componentWillReceiveProps替换为componentDidUpdate

因此,如果要将componentWillReceiveProps替换为componentDidUpdate,请将nextProps替换为this.props,将this.props替换为prevProps

  

nextProps(componentWillReceiveProps的参数)到this.props(在componentDidUpdate中)

     

this.props(在componentDidUpdate内部)到prevProps(在componentDidUpdate中)

尝试以下代码:

getDerivedStateFromProps(nextProps, prevState) {
  if(nextProps.shopList.isFetching === false || nextProps.common.isFetching === false) {
    return { isLoading: false }
  } else {
    return { isLoading: true }
  }
}

componentDidUpdate(prevProps) {
  if(this.props.shopList.isFetching === false) {
    if(!_.isEqual(this.props.shopList, prevProps.shopList) && this.props.shopList.error === false ) {
      this.formatShops(this.props.shopList.shops)
    }
  }

  if(this.props.common.error === false && this.props.common.isFetching === false) {
    if(!_.isEqual(this.props.common, prevProps.common) && this.props.common.error === false) {
      if(this.props.common.otpverifysucess == false) {
        this.props.navigation.dispatch(logoutAction);
      }
    }
  }
}