Expo Router:在挂载根布局之前尝试导航(在useEffect中使用router.replace时)
我正在使用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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。