我正在创建一个还具有Redux功能的React Native应用。导航由react-navigation处理,并遍历单个StackNavigator
。
当前,我正在进行身份验证流程。初始屏幕是登录屏幕。用户可以正确登录。以下屏幕是一个导航屏幕,并且用户单击指向他们想要去的地方的链接。到目前为止,一切都很好,我们在组件树中深了三级。
但是,在最后一个屏幕上,我有一个注销链接,该链接将用户带回到登录屏幕,并且登录屏幕加载了两次。观看此视频:
潜在的问题是,在StackNavigator
中,所有已安装的组件均保持已安装状态,因此componentDidUpdate
始终在所有组件中触发。至关重要的是,componentWillUnmount
does not fire,但是每次加载或重新加载屏幕时,constructor
和componentDidMount
都会这样做,因此,正如我所阐述的,管理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
时产生的混乱有关?如果是这样,我应该如何处理?如果不是,可能是什么原因?