当前位置: 首页 > 面试题库 >

用户注销时如何从其他屏幕重置TabNavigator

淳于枫
2023-03-14
问题内容

这是我的项目文件层次结构

RootTabNavigator
    | AuthStackNavigator // I want to go back to this navigator
          | AuthoScreen
    | Welcome Screen
    | MainTabNavigator // I want to reset MainTabNavigator 
          | FeedStacknavigator
                   | Screen A
          | OtherStackNavigatorOne
                   | Screen E
          | OtherStackNavigatorTwo
                   | Screen D
          | MenuStackNavigator 
                   | Menuo <-I'm here and want to reset to 'MainTabNavigator' 
                             and go BACK to 'AuthScreen'
           | Screen B
                   | Screen C

问题

用户位于MenuStackNavigator和MainTabNavigator下的Menuo屏幕上。

如果用户没有令牌(当用户注销时),则用户将返回到“身份验证”屏幕。

但是同时我想 重置MainTabNavigator
。您可以卸载,执行NavigationActions.init()或执行任何其他操作。我更喜欢NavigationActions.init()

我只想将MainTabNavigator设置为第一次。

如果没有令牌,我将返回到“身份验证屏幕”(正在运行)

This code if the part of Menuo Screen

componentWillReceiveProps(nextProps) {
    if ( nextProps.token == undefined || _.isNil(nextProps.token) ) {
      const backAction = NavigationActions.back({
        key: null
      })
      nextProps.navigation.dispatch(backAction);
      ...

(问题)如何重置MainTabNavigator(包括子StackNavigator)?

MainTabNavigator.js

export default TabNavigator(
    {
        Feed: {
          screen: FeedStacknavigator,
        },
        OtherOne: {
          screen: OtherStackNavigatorOne,
        }
        ...
    }, {
        navigationOptions: ({navigation}) => ){
            header: null,
        tabBarIcon: ({focused}) => ...
        ...
    }

可能的解决方案

我也许可以将MainTabNavigator从函数更改为类,然后在那里处理TabNavigator的重置。(我不确定)。

这次,我需要一个具体的工作示例。 我一直在阅读文档并将其应用到我的应用程序中,但无法解决。

如果有任何不清楚的地方,请告诉我。

更新

const RootTabNavigator = TabNavigator ({
    Auth: {
      screen: AuthStackNavigator,
    },
    Welcome: {
      screen: WelcomeScreen,
    },
    Main: {
      screen: MainTabNavigator,
    },
  }, {
    navigationOptions: () => ({
     ...
  }
);

export default class RootNavigator extends React.Component {
  componentDidMount() {
    this._notificationSubscription = this._registerForPushNotifications();
  }

问题答案:

这在大多数情况下应该有效:

componentWillReceiveProps(nextProps) {
    if ( nextProps.token == undefined || _.isNil(nextProps.token) ) {

        let action = NavigationActions.reset({
            index: 0,
            key: null,
            actions: [
                NavigationActions.navigate({routeName: 'Auth'})
            ]
        });

        nextProps.navigation.dispatch(action);
    }
    ...
}

或尝试通过自定义操作增强导航器:

const changeAppNavigator = Navigator => {
   const router = Navigator.router;

   const defaultGetStateForAction = router.getStateForAction;

   router.getStateForAction = (action, state) => {
       if (state && action.type === "RESET_TO_AUTH") {
          let payLoad = {
              index: 0,
              key: null,
              actions: [NavigationActions.navigate({routeName: "AuthStackNavigator"})]
          };

          return defaultGetStateForAction(NavigationActions.reset(payLoad), state);
          // or this might work for you, not sure:
          // return defaultGetStateForAction(NavigationActions.init(), state)
       }
       return defaultGetStateForAction(action, state);
  };

  return Navigator;
};

const screens = { ... }

RootTabNavigator = changeAppNavigator(TabNavigator(screens, {
  initialRouteName: ...,
  ...
}));

然后在你Menuo Screen做:

componentWillReceiveProps(nextProps) {
    if ( nextProps.token == undefined || _.isNil(nextProps.token) ) {

        nextProps.navigation.dispatch({type: "RESET_TO_AUTH"});
    ...


 类似资料:
  • 问题内容: 我创建了一个Login页面以及许多其他页面,其中包含用于检查会话的代码。如果用户没有会话,则所有页面将重新加载并重定向到注销页面。每三秒钟调用一次此脚本。 我编写的代码可以正常工作,但我想以另一种方式实现它。用户注销后,所有打开的选项卡都会重新加载/刷新,从而导致用户注销。那可能吗? sessioncheck.php : 此代码在每个页脚中: 问题答案: 当ajax有用时 在以下情况下

  • 我有一个游戏教程,我遵循,画字符串在屏幕上使用图形2D。它像明星一样工作,但唯一的问题是我不明白为什么。

  • 我目前正在使用2个项目。1个前端(使用laravel后端与API通信)和另一个laravel项目(API)。 现在,我使用LaravelPassport对用户进行身份验证,并确保每个API调用都是经过授权的调用。 现在,当我想注销我的用户时,我会向我的API发送一个post请求(使用承载令牌),并尝试将他注销API(并清除会话、cookies等) 然后在客户端上,我也刷新我的会话,这样令牌就不再是

  • 基本上我想要视频盗版保护 我的应用程序有视频流,我想保护我的视频流免受其他应用程序的影响。其他应用程序应该不能捕捉屏幕,而我的视频正在播放。任何建议我如何实现这一点…提前谢了。

  • 问题内容: 在终端中工作时,我看到了最后一个Shell命令执行输出的历史记录。如果运行vim,我会看到全屏打开的文件。退出vim时,我可以再次看到最后一个shell命令的历史记录。 但是,当我从屏幕上使用vim时。我在退出vim时看到的是刚刚编辑的文件的足迹,而不是最后一个shell命令的历史记录。 我想看看外壳的历史。 我该如何实现这种行为? 我用了: terminal.app和iterm2.a

  • 我有一个大小的图像(宽度=1444*高度=760)。现在我想在imageview中显示它,以设置imageview的重量和高度,我为dimens.xml创建不同的文件,如: dimens.xml dimens.xml(hdpi) dimens.xml(mdpi) dimens.xml(xhdpi) dimens.xml(xxhdpi) dimens.xml(xxxhdpi) dimens.xml(