按下 BottomTabNavigator 上的 Tab 时导航到屏幕

Navigate to the screen when Tab on BottomTabNavigator is pressed

我想在按下 BottomTabNavigator 上的特定选项卡时导航到屏幕。

通常情况下,当按下选项卡时,它会自动导航到配置的屏幕。但我不想有这种行为。我想隐藏该屏幕上的底部选项卡,并在顶部栏中也提供 back 功能。我通常在 ReactNavigationStack 屏幕中使用 navigation.navigate('routeName')。但是我不知道how/where在BottomTabNavigator配置中写这段代码

例如,我在底栏中有以下 5 个选项卡。当按下 Add 按钮时,我想导航到 AddNewScreen。我不知道将那个 onPress 事件放在哪里。我试着把它放在 optionsBottomTab.Screen 下。但是还是不行。

我试图拦截 onPress 事件以使用 navigation.navigate。但它甚至没有被击中,它总是打开带有标签栏的 AddNewScreen。

<BottomTab.Navigator initialRouteName={INITIAL_ROUTE_NAME}>
      <BottomTab.Screen
        name="Home"
        component={HomeScreen}
        initialParams="Home Params"
        options={{
          title: 'Home',
          tabBarIcon: ({ focused }) => <TabBarIcon focused={focused} name="md-home" iconType="ion" />,
        }}
      />      
      <BottomTab.Screen
        name="AddNew"
        component={AddNewScreen}        
        options={{
          title: 'Add',
          tabBarIcon: ({ focused }) => <TabBarIcon focused={focused} name="md-add-circle" iconType="ion" 
          onPress={(e) => {
            e.preventDefault();
            console.log(e)
          }} />,    
        }}
      />
</BottomTab.Navigator>

“添加新”屏幕始终使用底部标签栏打开。

问题:

  1. 无论如何在标签为时都可以导航到特定屏幕 压?
  2. 有没有隐藏底部标签栏的添加新 屏幕?

更新:

导航库 v6 支持 Listener 可以使用的功能

<Tab.Screen
  name="Chat"
  component={Chat}
  listeners={{
    tabPress: e => {
      // Prevent default action
      e.preventDefault();

      //Any custom code here
      alert(123);
    },
  }}
/>;

您可以使用标签栏按钮在底部工具栏中拥有自定义功能。代码如下

<Tab.Screen
  name="Settings2"
  component={SettingsScreen}
  options={{
    tabBarButton: props => (
      <TouchableOpacity {...props} onPress={() => alert(123)} />
    ),
  }}
/>

这会呈现一个正常的底部标签栏按钮,但 onclick 会显示警报,您可以将代码替换为您的导航或您需要的任何其他代码。 'SettingsScreen' 组件也可以是返回 null 的虚拟组件。

希望对您有所帮助。

您可以拥有自定义功能

 <Tab.Screen
      name="Add"
      component={View}
      listeners={({ navigation }) => ({
        tabPress: (e) => {
          // Prevent default action
          e.preventDefault();

          // Do something with the `navigation` object
          navigation.navigate("PhotoNavigation"); // Here!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        },
      })}
    />
<Tab.Screen name="Notifications" component={Notifications} />