Android 在React Native中的现有状态转换期间(例如在“render”内)无法更新

Android 在React Native中的现有状态转换期间(例如在“render”内)无法更新,android,ios,react-native,react-native-android,react-native-ios,Android,Ios,React Native,React Native Android,React Native Ios,您好,我有一个屏幕,其中有一个条件是isProductTourCompleted如果为true,则我将导航到仪表板屏幕。我正在尝试使用AsyncStorageAPI在componentDidMount方法中获取它的价值。我试图在组件willmount中更新它,但没有成功 如果为true,则更新状态并重新渲染组件,然后导航到仪表板。它会打开仪表板屏幕,但会显示此警告 我检查了几个有其他原因的线程。谁能暗示我做错了什么 在React Native中的现有状态转换期间(例如在呈现中)无法更新 导出默认

您好,我有一个屏幕,其中有一个条件是
isProductTourCompleted
如果为true,则我将导航到
仪表板
屏幕。我正在尝试使用
AsyncStorage
API在
componentDidMount
方法中获取它的价值。我试图在
组件willmount
中更新它,但没有成功

如果为true,则更新状态并重新渲染组件,然后导航到
仪表板
。它会打开
仪表板
屏幕,但会显示此警告

我检查了几个有其他原因的线程。谁能暗示我做错了什么

在React Native中的现有状态转换期间(例如在
呈现中)无法更新

导出默认类FirstProductTour扩展组件{
建造师(道具){
超级(道具);
this.\u startDashboardScreen=this.\u startDashboardScreen.bind(this);
此.state={
isProductTourCompleted:false
};
}
componentDidMount(){
AsyncStorage.getItem(“@ProductTour:key”)。然后(值=>{
如果(值)
这是我的国家({
isProductTourCompleted:true
});
});
}
render(){
const{navigate}=this.props.navigation;
返回(
{this.state.isProduct已完成
?这个。_startDashboardScreen()
: 
{strings.talk_people}
{
const resetAction=NavigationActions.reset({
索引:0,
行动:[
导航({
routeName:“SecondProductTour”
})
]
});
这个.props.navigation.dispatch(resetAction);
}}
>
{strings.continueText}
}
);
}
_startDashboardScreen(){
const resetAction=NavigationActions.reset({
索引:0,
行动:[
导航({
routeName:“仪表板”
})
]
});
这个.props.navigation.dispatch(resetAction);
}
}

您需要检查是导航到FirstProductTour还是导航到函数上的DashPage,还是从单独的容器中导航到DashPage

在内部,React使用了几种巧妙的技术来最小化更新UI所需的代价高昂的DOM操作的数量。
componentDidMount
中设置状态只会触发频繁的重新渲染,从而导致性能优化不良。即使道具不变,组件也会重新渲染

最佳解决方案:使用容器组件(或ButtonClick之类的函数)进行条件检查并决定导航

另一个解决方案是检查条件并调用
组件willmount
上的导航功能。像下面这样

componentDidMount() {
    AsyncStorage.getItem("@ProductTour:key").then(value => {
      if (value)
       this._startDashboardScreen()
    });
  }

您需要检查是在函数上导航到FirstProductTour还是从单独的容器导航到DashPage

在内部,React使用了几种巧妙的技术来最小化更新UI所需的代价高昂的DOM操作的数量。
componentDidMount
中设置状态只会触发频繁的重新渲染,从而导致性能优化不良。即使道具不变,组件也会重新渲染

最佳解决方案:使用容器组件(或ButtonClick之类的函数)进行条件检查并决定导航

另一个解决方案是检查条件并调用
组件willmount
上的导航功能。像下面这样

componentDidMount() {
    AsyncStorage.getItem("@ProductTour:key").then(value => {
      if (value)
       this._startDashboardScreen()
    });
  }

您需要检查是在函数上导航到FirstProductTour还是DashPage,还是从单独的容器导航到DashPage。无法在渲染时检查此选项,因为这将导致错误。尝试在ComponentDidMount上调用navigate,而不是设置状态。@vicky是正确的。如果productTourCompleted为true,则您似乎没有更改状态/视图,因此如果您只想导航到其他屏幕,则无需重新渲染。与其在ComponentDidMount中设置状态,不如直接在那里调用导航。看起来效果不错:)@Vicky你们能回答一些细节吗,这样对未来的读者也会有用并接受:)你需要检查是导航到FirstProductTour还是在函数上导航到DashPage,还是从单独的容器导航到DashPage。无法在渲染时检查此选项,因为这将导致错误。尝试在ComponentDidMount上调用navigate,而不是设置状态。@vicky是正确的。如果productTourCompleted为true,则您似乎没有更改状态/视图,因此如果您只想导航到其他屏幕,则无需重新渲染。不要在你的组件中设置状态,直接在那里调用你的导航。看起来它起作用了:)@Vicky你们能回答一些细节吗,这样对未来的读者也会有用并接受它:)