Expo Router嵌套导航异常求助:跳转/home却返回/
Expo Router嵌套导航异常修复方案
问题原因
你遇到的导航跳转异常,核心是嵌套栈的路由匹配逻辑和push方法的使用场景误解:
- Tabs内部嵌套的Stack属于子导航栈,和根Stack是层级关系;
- 使用
router.push('/home')时,Expo Router会在根Stack中新增一个Tabs实例,而非回到已存在的Home子Stack的根页面; - 重复push后,根Stack的历史记录会变成
[/, /(tabs)/home, /(tabs)/home],此时返回自然会回到最开始的/。
解决方法
方法1:用router.back()替代push返回
如果是从/home/welcome返回上一级/home,直接用返回上一页的API,而非新增路由:
// 在 /home/welcome 页面中 import { router } from 'expo-router'; // 替换原来的 router.push('/home') router.back();
这种方式会直接操作Home子Stack的历史记录,回到子栈的上一页,不会影响根Stack的层级。
方法2:使用完整嵌套路由路径push
如果需要从其他页面主动跳转至Home子栈的根页面,要指定完整的嵌套路由路径(而非简写的/home):
// 正确跳转至Home子栈根页面 router.push('/(tabs)/home');
这样Expo Router会匹配到Tabs内部的Home子Stack,而非在根Stack中新建Tabs实例。
方法3:用router.replace()替换当前路由
如果需要覆盖当前页面(比如从welcome直接回到home,不保留welcome的历史记录),可以用replace替代push:
router.replace('/home');
这种方式会替换子Stack中当前的welcome路由为home,不会新增根Stack的历史记录。
额外验证点
检查你的路由配置是否正确:
- 根
app/_layout.tsx中要将(tabs)作为一个Screen:
import { Stack } from 'expo-router'; export default function RootLayout() { return ( <Stack> <Stack.Screen name="index" options={{ headerShown: false }} /> <Stack.Screen name="(tabs)" options={{ headerShown: false }} /> </Stack> ); }
- Tabs内部的Home子Stack
app/(tabs)/home/_layout.tsx要正确嵌套:
import { Stack } from 'expo-router'; export default function HomeStack() { return ( <Stack> <Stack.Screen name="index" options={{ title: 'Home' }} /> <Stack.Screen name="welcome" options={{ title: 'Welcome' }} /> </Stack> ); }
内容的提问来源于stack exchange,提问作者smins
相关产品推荐
相关产品推荐

