You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的历史记录。

额外验证点

检查你的路由配置是否正确:

  1. 根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>
  );
}
  1. Tabs内部的Home子Stackapp/(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 10:03:16