我听说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生命周期方法中
答案 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);
}
}
}
}