【问题标题】:What is the proper way of dealing with navigation to screens located in separate navigators directly in react navigator 5?在反应导航器5中直接处理位于单独导航器中的屏幕导航的正确方法是什么?
【发布时间】:2020-06-05 03:05:11
【问题描述】:

我有一个应用场景,其中我有一个底部选项卡导航器作为我的基本导航器选项卡,主页、产品...作为我的选项卡:

<Tab.Navigator
    screenOptions={{
      headerShown: true,
    }}
    tabBarOptions={{
      showLabel: false,
      activeTintColor: MyColors.COLOR_ACCENT,
    }}>
    <Tab.Screen
      name="Home"
      component={HomeStack}
      options={{
        tabBarIcon: ({color, size}) => (
          <Icon name="home" color={color} size={size} />
        ),
      }}
    />

    <Tab.Screen
      name="Product"
      component={ProductStack}
      options={{
        tabBarIcon: ({color, size}) => (
          <Icon name="business-center" color={color} size={size} />
        ),
      }}
    />
    <Tab.Screen
      name="Request"
      component={MedRequest}
      options={{
        color: MyColors.COLOR_PRIMARY,
        tabBarIcon: ({color, size}) => (
          <Icon
            name="near-me"
            color={color}
            size={35}
            style={{transform: [{rotateZ: '20deg'}]}}
          />
        ),
      }}
    />
    <Tab.Screen
      name="Reminder"
      component={Reminder}
      options={{
        tabBarIcon: ({color, size}) => (
          <Icon name="alarm" color={color} size={size} />
        ),
      }}
    />
    <Tab.Screen
      name="Location"
      component={LocationStack}
      options={{
        tabBarIcon: ({color, size}) => (
          <Icon name="location-on" color={color} size={size} />
        ),
      }}
    />
  </Tab.Navigator>

让我们考虑一下我在底部选项卡中的前 2 个屏幕。 第一个是家。它包含前 5 个热门产品的列表和一个“查看全部”链接,该链接将其导航到第二个标签产品。

每个单独列出的产品都应该导航到产品详细信息页面。由于底部选项卡导航器中没有定义 productDetail 导航,我尝试通过 homeStack 在主页中创建一个新的 Stack 导航器来解决这个问题,如下所示:

<Stack.Navigator
    screenOptions={{
      headerShown: false,
    }}>
    <Stack.Screen name="Home" component={Home} />
    <Stack.Screen name="Notifications" component={Notifications} />
    <Stack.Screen name="ProductDetail" component={ProductDetail} />
    <Stack.Screen name="AuthStack" component={AuthStack} />
    <Stack.Screen name="BlogStack" component={BlogStack} />
    <Stack.Screen name="BlogDetail" component={BlogDetail} />
    <Stack.Screen name="Cart" component={CartStack} />
  </Stack.Navigator>

现在我们在处理程序中有 productDetail 导航器,我可以导航到产品详细信息。 同样,产品底部选项卡在顶部有另一个堆栈导航器 ProductStack,它有助于导航到其各种链接。是这样的:

<Stack.Navigator
    screenOptions={{
      headerShown: false,
    }}>
    <Stack.Screen name="Product" component={Product} />
    <Stack.Screen name="CartStack" component={CartStack} />
    <Stack.Screen name="ProductDetail" component={ProductDetail} />
  </Stack.Navigator>

我在这里主要担心的是,我在不止一个地方将 ProductDetail 和 CartStack 作为导航器的一个元素包含在内,我觉得我做的不对。

这种多级堆叠的导航器也会导致性能问题吗?

当我从主屏幕直接导航到 productDetail 时,我访问的 cartStack 也会导致底部选项卡消失。

我在这里处理情况完全错误吗?有没有更简单的方法可以做到这一点,我还没有想到?

【问题讨论】:

    标签: react-native react-navigation react-navigation-v5 react-navigation-bottom-tab


    【解决方案1】:

    所以这取决于你想留在哪个标签上,如果你想留在主标签上,你可以把它留在主堆栈中。如果您想转到产品选项卡 -> 产品详细信息页面,那么当他们返回/关闭时,它将返回到产品选项卡的根屏幕,那么您可以执行以下操作来导航到嵌套屏幕:

    navigation.navigate('Product', { screen: 'ProductDetail' });
    
    

    【讨论】:

    • 这种做法解决了直接从主页通过产品详细信息导航到购物车堆栈时底部选项卡消失的问题。谢谢。
    • 我只是在等待自己在所有这些相关问题中实施您的答案。 :) 再次感谢。
    【解决方案2】:

    我认为您应该将ProductDetailCartStackBottomTabContainer 放在Stack.Navigator 中,然后您可以轻松地从BottomTabNavigator 中的任何位置导航到ProductDetailCartStack

    类似这样的:

    <Stack.Navigator
      screenOptions={{
        headerShown: false,
      }}>
      <Stack.Screen name="TabNavigator" component={YourTabComponent} />
      <Stack.Screen name="CartStack" component={CartStack} />
      <Stack.Screen name="ProductDetail" component={ProductDetail} />
    </Stack.Navigator>

    然后您可以从HomeStackProductStack 中删除您的CartStackProductDetail

    【讨论】:

    • 这本来不错,但它使 productDetail 表现为 BottomTabContainer 的兄弟,因此底部选项卡在导航时是不可见的。
    • 哦..在那种情况下,我认为您的实现是正确的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-12
    • 1970-01-01
    • 2018-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多