如何在Expo Router V2中嵌套Stack Navigation到Tab Navigation?
在Tab导航的设置页中嵌套Stack导航(保留底部Tab)
要实现这个需求,核心是导航嵌套——将Stack导航作为Tab导航中「设置」标签页的子容器。这样从设置页跳转到它的子页面时,底部Tab导航栏会始终保留在屏幕底部。以下是基于React Navigation 6.x(当前主流版本)的具体实现步骤:
1. 安装必要依赖
npm install @react-navigation/native @react-navigation/bottom-tabs @react-navigation/native-stack # 若使用Expo,额外安装原生依赖 expo install react-native-screens react-native-safe-area-context
2. 创建设置页的Stack导航
先定义设置页及其子页面的Stack容器,比如包含「设置主页」「个人资料设置」「通知设置」:
import { createNativeStackNavigator } from '@react-navigation/native-stack'; import SettingsScreen from '../screens/SettingsScreen'; import ProfileSettingsScreen from '../screens/ProfileSettingsScreen'; import NotificationSettingsScreen from '../screens/NotificationSettingsScreen'; const Stack = createNativeStackNavigator(); function SettingsStack() { return ( <Stack.Navigator> {/* 栈的初始页面为设置主页 */} <Stack.Screen name="SettingsHome" component={SettingsScreen} options={{ title: '设置' }} /> <Stack.Screen name="ProfileSettings" component={ProfileSettingsScreen} options={{ title: '个人资料' }} /> <Stack.Screen name="NotificationSettings" component={NotificationSettingsScreen} options={{ title: '通知设置' }} /> </Stack.Navigator> ); }
3. 创建底部Tab导航并嵌套Stack
将上述SettingsStack作为Tab导航中「设置」项的屏幕组件:
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs'; import HomeScreen from '../screens/HomeScreen'; import SearchScreen from '../screens/SearchScreen'; import { SettingsStack } from './SettingsStack'; const Tab = createBottomTabNavigator(); function MainTabNavigator() { return ( <Tab.Navigator> <Tab.Screen name="Home" component={HomeScreen} options={{ title: '首页' }} /> <Tab.Screen name="Search" component={SearchScreen} options={{ title: '搜索' }} /> {/* 用SettingsStack替代单个SettingsScreen */} <Tab.Screen name="Settings" component={SettingsStack} options={{ title: '设置' }} /> </Tab.Navigator> ); }
4. 在根组件中渲染导航容器
import { NavigationContainer } from '@react-navigation/native'; import { MainTabNavigator } from './MainTabNavigator'; export default function App() { return ( <NavigationContainer> <MainTabNavigator /> </NavigationContainer> ); }
5. 在设置页内跳转子页面
在SettingsScreen中,通过navigation对象跳转至Stack内的子页面:
import { View, Button } from 'react-native'; function SettingsScreen({ navigation }) { return ( <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center', gap: 16 }}> <Button title="修改个人资料" onPress={() => navigation.navigate('ProfileSettings')} /> <Button title="通知设置" onPress={() => navigation.navigate('NotificationSettings')} /> </View> ); }
关键说明
- 嵌套层级为
NavigationContainer→TabNavigator→SettingsStack→ 具体屏幕,确保Stack的所有页面都在Tab导航上下文下渲染,底部Tab不会消失。 - 若需隐藏Stack在Tab页内的默认头部,可给
Stack.Navigator添加screenOptions={{ headerShown: false }},再自定义页面内的头部组件。 - 可通过
Tab.Screen的options配置Tab的图标、样式等,Stack的页面样式则通过Stack.Screen的options单独设置。
内容的提问来源于stack exchange,提问作者Rene Kutter
相关产品推荐
相关产品推荐

