React Native-注销后登录屏幕加载两次

时间:2018-10-02 16:17:33

标签: reactjs react-native redux react-navigation

我正在创建一个还具有Redux功能的React Native应用。导航由react-navigation处理,并遍历单个StackNavigator

当前,我正在进行身份验证流程。初始屏幕是登录屏幕。用户可以正确登录。以下屏幕是一个导航屏幕,并且用户单击指向他们想要去的地方的链接。到目前为止,一切都很好,我们在组件树中深了三级。

但是,在最后一个屏幕上,我有一个注销链接,该链接将用户带回到登录屏幕,并且登录屏幕加载了两次。观看此视频:

enter image description here

潜在的问题是,在StackNavigator中,所有已安装的组件均保持已安装状态,因此componentDidUpdate始终在所有组件中触发。至关重要的是,componentWillUnmount does not fire,但是每次加载或重新加载屏幕时,constructorcomponentDidMount都会这样做,因此,正如我所阐述的,管理componentDidUpdate变得非常困难在下面。

我使用保存在Redux存储中的isAuthenticated布尔值来确定用户是否已登录,如果没有登录,我将重定向到Login组件,如下所示:

componentDidUpdate() {
  if (this.props.login.toJS().isAuthenticated == false) {
    this.props.navigation.navigate('Login'));
  };
}

在我在上面的初始描述中提到的第三个组件中,可点击链接不会直接导航到Login组件。相反,它会调用导致isAuthenticated变为错误的操作,如下所示:

logout = () => {
    this.props.logoutUser(this.props.login);
};

然后它依靠componentDidUpdate进行实际的重定向。

我尝试分别在Redux存储中使用currentScreen状态和在每个单独组件中使用shouldUpdate本地状态来管理我实际要执行的componentDidUpdate。请参见下面的后者的示例:

componentDidUpdate() {
  if (this.state.shouldUpdate == true) {
    // Do something
  };
}

我还尝试了一种类似的策略,依靠react-navigation跟踪当前屏幕处于其状态的能力,例如:

componentDidUpdate() {
  if (this.props.navigation.state.routeName == "SomeScreen") {
    // Do something
  };
}

但是这些都不能解决问题。屏幕多次加载仍然出现奇怪的行为。

我还尝试将shouldComponentUpdate method与前面提到的shouldUpdate状态结合使用,并保留在每个组件中。但这并没有达到预期的结果,因为shouldUpdate最终在我遍历导航树时发生了神秘的变化。我将其最可能归因于在再次访问组件时恢复constructor,从而恢复了默认的本地状态。

如何停止StackNavigator中较早屏幕的多次加载?实际上,这是否与在后台触发componentDidUpdate时产生的混乱有关?如果是这样,我应该如何处理?如果不是,可能是什么原因?

0 个答案:

没有答案