Expo Router:在挂载根布局之前尝试导航(在useEffect中使用router.replace时)

编程语言 2026-07-10

我正在使用Expo Router,并尝试在根布局中处理认证。如果用户未通过身份验证,我希望将他们重定向到登录页面。

但当我在 useEffect 内使用 router.replace() 时,出现了这个错误:
错误:在挂载Root Layout组件之前尝试进行导航。

请确保Root Layout组件在第一次渲染时渲染一个Slot,或其他导航器。

 ERROR  [Error: Attempted to navigate before mounting the Root Layout component. Ensure the Root Layout component is rendering a Slot, or other navigator on the first render.] 

Code: _layout.tsx
   9 |     useEffect(() => {
  10 |     if (!isAuth) {
> 11 |         route.replace("/(auth)/sign-in");
     |                      ^
  12 |     }
  13 |     }, [isAuth]);
  14 |
Call Stack
  useEffect$argument_0 (app/_layout.tsx:11:22)

[文件夹结构:]

文件夹结构

解决方案

Expo团队建议在认证后需要把用户重定向到受保护的屏幕时,使用受保护的路由。

expo-router 负责通过在每个路由文件夹中包装 inside _layout 组件来构建并调度子屏幕的渲染。

在子组件中的useEffect里执行屏幕重定向,与内部渲染行为冲突。

我建议你使用声明式的 Protected Router 策略,而不是以命令式重定向到特定屏幕。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章