重定向到未经身份验证用户的登录屏幕(react-native、react-navigation、react-redux)

重定向到未经身份验证用户的登录屏幕(react-native、react-navigation、react-redux),react-native,react-redux,react-navigation,React Native,React Redux,React Navigation,我的react native应用程序允许用户在不登录的情况下使用它,但某些屏幕要求用户登录才能访问。我使用的是react导航,当未经验证的用户导航到其中一个屏幕时,我想重定向到登录屏幕 现在,对于已注销的用户,屏幕的呈现方式完全不同,但理想情况下它根本不会呈现(只是重定向): 从'react redux'导入{connect}; 从“/ProfileScreen”导入ProfileScreen; 常量mapStateToProps=(状态)=>{ const{currentUser}=状态; 返

我的react native应用程序允许用户在不登录的情况下使用它,但某些屏幕要求用户登录才能访问。我使用的是react导航,当未经验证的用户导航到其中一个屏幕时,我想重定向到登录屏幕

现在,对于已注销的用户,屏幕的呈现方式完全不同,但理想情况下它根本不会呈现(只是重定向):

从'react redux'导入{connect};
从“/ProfileScreen”导入ProfileScreen;
常量mapStateToProps=(状态)=>{
const{currentUser}=状态;
返回{
当前用户,
};
};
导出默认连接(MapStateTops)(ProfileScreen);
//ProfileScreen.js
从“React”导入React;
从“react native”导入{Text};
const ProfileScreen=(道具)=>{
if(props.currentUser==null){
返回您未登录的状态;
}
返回您的个人资料;
};
导出默认配置文件屏幕;

重定向的正确位置在哪里?我也在使用redux,因此我看到了将它放在容器的componentDidMount中或redux链中某个位置的建议。

是的,您应该在
配置文件屏幕
组件的
componentDidUpdate
方法中进行检查,以检测redux存储中是否有
currentUser

用户注销后,只需将导航状态重置为
Login
屏幕。在组件的
componentdiddupdate

componentDidUpdate(prevProps){
   if(!this.props.currentUser){
      const resetAction = StackActions.reset({
            index: 0,
            actions: [NavigationActions.navigate({ routeName: 'Login' })],
       });
      this.props.navigation.dispatch(resetAction);
  }
}
这将重置导航状态并导航到
登录
屏幕


注:如果您的
登录
屏幕位于另一个堆栈中,请在
重置操作
参数中添加prop
键:null
。这将重置主应用程序导航器,然后导航到
登录
屏幕。

是的,您应该检查
配置文件屏幕
组件的
组件更新
方法,以检测redux商店中是否有
当前用户

用户注销后,只需将导航状态重置为
Login
屏幕。在组件的
componentdiddupdate

componentDidUpdate(prevProps){
   if(!this.props.currentUser){
      const resetAction = StackActions.reset({
            index: 0,
            actions: [NavigationActions.navigate({ routeName: 'Login' })],
       });
      this.props.navigation.dispatch(resetAction);
  }
}
这将重置导航状态并导航到
登录
屏幕


注:如果您的
登录
屏幕位于另一个堆栈中,请在
重置操作
参数中添加prop
键:null
。这将重置主应用程序导航器,然后导航到
登录
屏幕。

屏幕安装后(包括用户从屏幕本身注销时)不会触发此操作。我应该在
componentdiddupdate()
中也放置相同的重定向,还是从注销操作创建者处重定向?哦,对不起,我是说
componentdiddupdate
!是的,您也可以在
componentDidMount
中保留此签入。我已经更新了答案。它似乎实际上需要同时进入这两个页面,因为
componentdiddupdate
在第一次装入时不会触发。是的,在两种生命周期方法中都需要它,这两种方法都不会在屏幕装入后触发(包括用户从屏幕本身注销时)。我应该在
componentdiddupdate()
中也放置相同的重定向,还是从注销操作创建者处重定向?哦,对不起,我是说
componentdiddupdate
!是的,您也可以在
componentDidMount
中保留此签入。我已经更新了答案它似乎实际上需要同时进入这两个程序,因为
componentdiddupdate
在第一次装入时不会启动。是的,在这两种生命周期方法中都需要它。您是否有机会分享完整实现的示例?您好。您是否有机会分享完整实现的示例?