退出抽屉内的子堆栈导航器时,如何使用 react-navigation 进入 initialRoute?

Posted

技术标签:

【中文标题】退出抽屉内的子堆栈导航器时,如何使用 react-navigation 进入 initialRoute?【英文标题】:How to go to initialRoute with react-navigation when exiting a child stack navigator inside a drawer? 【发布时间】:2019-11-25 14:02:33 【问题描述】:

我用 react-native、expo 和 react-navigation 构建了一个应用程序。我有一个主抽屉导航器,其中有 2 个其他堆栈导航器。一个堆栈导航器有 2 页; Products 和产品。当我点击Products 页面中的一个产品时,它会进入Product 页面。 Ben 如果我单击抽屉导航器中的另一个链接,我希望产品页面的堆栈导航器在离开堆栈导航器时返回到它的 initialRoute。

我尝试在退出堆栈导航器时设置 initialState,当我单击抽屉导航器中的导航器链接时,它会呈现 initialState,但是当我在子页面中并退出时它不起作用航海家。当我再次单击抽屉中的Products 时,它没有导航到Products 页面,而是停留在Product

我可以在我的抽屉导航器中创建静态链接并使用this.props.navigation.navigate 始终转到this.props.navigation.navigate('Products'),但这将是我想要的最后一件事。我真的很喜欢我的抽屉导航器在我传递给它的内容时保持动态。

componentWillUnmountlifecycle 继续时,我尝试this.props.navigation.navigate,但没有成功。

我该怎么做?

感谢您的帮助!

【问题讨论】:

也许您不想设置赏金,而是想向我们展示您的问题的清晰解释,包括图像和步骤,代码 sn-ps。 SO 上 99% 的问题都没有得到回答,因为它们写得不好 因为这是一个非常简单的问题,当您知道时,每个导航器都可以在所有方面完成。它不在我自己的代码中,而是一个普遍的问题。如果你没看错的话,我什至建议了一种方法,我不想遵循,这样做。 【参考方案1】:

是的,完全可以使用 react-navigation 重置堆栈,为此有一个 specific action。

这是一个抽屉位于标签导航中的示例。

首先我们在MenuDrawer.js中定义我们的抽屉,这里没什么特别的:

import  createDrawerNavigator  from 'react-navigation';

import ProductStack from './ProductStack';
import OtherStack from './OtherStack';

const MenuDrawer = createDrawerNavigator(
  Product: 
    screen: ProductStack,
    navigationOptions: 
      drawerLabel: 'My products',
    ,
  ,
  Other: 
    screen: OtherStack,
    navigationOptions: 
      drawerLabel: 'Something else',
    ,
  ,
);


export default MenuDrawer;

最后我们定义了我们的标签导航,我们使用tabBarOnPress 导航选项来监听任何抽屉打开并在需要时重置堆栈:

import  createBottomTabNavigator, StackActions, NavigationActions  from 'react-navigation';

import MenuDrawer from './MenuDrawer';

const BottomTabs = createBottomTabNavigator(
  Menu: 
    screen: MenuDrawer,
    navigationOptions: 
      title: 'Menu',
      tabBarOnPress: ( navigation ) => 
        const notResetRoute = navigation.state.routes.find(x => x.index > 0); // Check for stack not positioned at the first screen
        if (notResetRoute) 
          const resetAction = StackActions.reset( // We reset the stack (cf. documentation)
            index: 0,
            actions: [
              NavigationActions.navigate( routeName: notResetRoute.routes[0].routeName ),
            ],
          );
          navigation.dispatch(resetAction);
        
        navigation.openDrawer(); // Finally we open the drawer
      ,
    ,
  ,
);


export default BottomTabs;

当用户点击相应的选项卡时,抽屉就会打开。显然,如果抽屉以不同的方式打开,例如通过单击给定屏幕中的按钮,则可以进行相同的操作。重要的是同时重置堆栈。

【讨论】:

嗨,我能用 reactNavigation v5 调整它吗?我发布了这个***.com/questions/43090884/…【参考方案2】:
import  NavigationActions  from 'react-navigation'

this.props.navigation.dispatch(NavigationActions.reset(
    index: 0,
    key: null,
    actions: [NavigationActions.navigate( routeName: 'ParentStackScreen' )]
))

【讨论】:

解释有助于更好地理解。

以上是关于退出抽屉内的子堆栈导航器时,如何使用 react-navigation 进入 initialRoute?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 React Navigation Drawer 切换屏幕

如何在抽屉导航器中的屏幕反应导航中设置自定义边框半径和 zIndex?

处理导航抽屉内的 ViewPager 滑动

单击抽屉的任何项目而不在android中关闭时更改导航抽屉内的视图和内容

在 react native 中构建自定义抽屉时,如何在抽屉项目上使用按钮/图标?

导航组件替换/更改后台堆栈