React Navigation中是否可将drawer navigation嵌套到tab navigation内?
首先需要先导入抽屉导航的创建方法:import { createDrawerNavigator } from '@react-navigation/drawer';
场景1:仅单个Tab页绑定抽屉导航
如果你只需要某一个Tab页面(比如Home页)可呼出抽屉,直接把对应Tab页的组件替换为封装好的抽屉导航即可:
const Drawer = createDrawerNavigator(); // 封装Home页对应的抽屉导航 function HomeDrawer() { return ( <Drawer.Navigator initialRouteName="HomeMain"> {/* 抽屉默认展示的原Home页面 */} <Drawer.Screen name="HomeMain" component={Home} /> {/* 抽屉内的其他自定义页面 */} <Drawer.Screen name="DrawerSetting" component={DrawerSetting} /> <Drawer.Screen name="DrawerAbout" component={DrawerAbout} /> </Drawer.Navigator> ); }
修改你原有Tab导航的对应配置,将Home页的component替换为上面的HomeDrawer:
// 原来的写法 // <Tab.Screen name="Home" component={Home} /> // 修改后写法 <Tab.Screen name="Home" component={HomeDrawer} />
后续在Home页面内可以直接调用navigation.openDrawer()方法呼出抽屉。
场景2:所有Tab页共用全局抽屉
如果你需要所有Tab页面都可以呼出同一个抽屉,直接把整个Tab导航嵌套到抽屉导航内部作为根导航即可:
const Drawer = createDrawerNavigator(); const Tab = createBottomTabNavigator(); // 封装原有Tab导航为独立组件 function TabNavigator() { return ( <Tab.Navigator initialRouteName="Home" screenOptions={({ route }) => ({ tabBarIcon: ({ focused, color, size }) => { let iconName; if (route.name === 'Home') { iconName = focused ? 'funnel-outline' : 'funnel'; } else if (route.name === 'ASYNCH') { iconName = focused ? 'scan' : 'scan-outline'; } else if (route.name === 'Config') { iconName = focused ? 'earth-outline' : 'earth'; } else if (route.name === 'Search') { iconName = focused ? 'terminal' : 'terminal-outline'; } else if (route.name === 'status') { iconName = focused ? 'code-slash' : 'code-slash-outline'; } return <Ionicons name={iconName} size={size} color={color} />; }, tabBarActiveTintColor: '#000000', tabBarInactiveTintColor: '#000000', headerShown: false, })}> <Tab.Screen name="Home" component={Home} /> <Tab.Screen name="ASYNCH" component={sc2} /> <Tab.Screen name="Config" component={sc3} /> <Tab.Screen name="Search" component={Search} /> <Tab.Screen name="status" component={statusbar} /> </Tab.Navigator> ) } // 根导航改为抽屉包裹Tab导航 export default function RootNavigation() { return ( <NavigationContainer> <Drawer.Navigator initialRouteName="TabRoot" screenOptions={{headerShown: false}}> <Drawer.Screen name="TabRoot" component={TabNavigator} /> {/* 抽屉内的其他自定义页面 */} <Drawer.Screen name="DrawerSetting" component={DrawerSetting} /> <Drawer.Screen name="DrawerAbout" component={DrawerAbout} /> </Drawer.Navigator> </NavigationContainer> ) }
这种结构下所有Tab页面都可以直接调用navigation.openDrawer()呼出全局抽屉。
注意事项
- 不同层级导航的路由名仅需保证当前层级唯一即可,不会冲突
- 嵌套导航的所有内置方法(openDrawer、closeDrawer、jumpTo等)都可以直接通过对应页面的navigation对象调用,不需要额外传参
- 如果要在具体的业务页面内单独封装抽屉,也可以直接在页面组件内渲染Drawer.Navigator,使用逻辑和上面一致
内容的提问来源于stack exchange,提问作者localhost.3030
相关产品推荐
相关产品推荐

