关于 expo-router
面向 React Native 开发者的 Expo Router 6.x 路由技能,通过 `app/` 目录中的文件构建导航。内容涵盖布局、路由组、动态参数和导航约定。
主要功能
- 01将 `app/` 文件映射为导航屏幕
- 02设置嵌套布局和路由组
- 03创建动态路由与兜底路由
- 04导航并读取路由参数
- 05处理未找到页面和屏幕选项
适用场景
- 01按路由组组织屏幕
- 02添加带参数的详情页面
- 03配置 Stack 或 Tab 导航
- 04设置共享 Provider 和 404 页面
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ dralgorhythm/ claude-agentic-framework --skill expo-router安装后在 Claude Code 中输入/expo-router确认已加载。
详细介绍
Expo Router
概述
使用 Expo Router 6.x 为 React Native 实现基于文件的路由。将 app/ 目录中的文件系统结构映射到导航屏幕。支持 Stack 和 Tab 导航器、路由组、动态参数和嵌套布局。
安装:已包含在 Expo SDK 54+ 中。请确保依赖项中包含 expo-router。
工作流
设置路由:
- 创建
app/_layout.tsx作为根布局(提供程序、全局界面元素) - 创建路由组目录:
app/(demo)/、app/(auth)/ - 在每个组中添加
_layout.tsx,用于配置组专属导航 - 添加
index.tsx作为默认屏幕 - 添加
[param].tsx作为动态路由 - 添加
+not-found.tsx处理 404
添加新屏幕:
- 在合适的路由组中创建文件
- 导出默认 React 组件
- 在父级
_layout.tsx中配置屏幕选项,或通过<Stack.Screen options={...} />配置 - 使用
useRouter()或<Link>进行导航
指南
文件约定
| 文件 | 用途 |
|---|---|
_layout.tsx | 目录的布局封装(提供程序、导航器) |
index.tsx | 目录的默认屏幕 |
[param].tsx | 动态路由段 |
[...catchAll].tsx | 全匹配路由 |
+not-found.tsx | 404 屏幕 |
(group)/ | 路由组(不包含 URL 路径段) |
根布局模式
根目录中的 _layout.tsx 是入口点。可在其中设置全局提供程序:
app/_layout.tsx → GestureHandlerRootView > SafeAreaProvider > Context > Stack
保持根布局精简——将界面元素(标签栏、标题栏)放入组布局中。
路由组
路由组 (name)/ 可整理屏幕,同时不影响 URL 路径。常见模式:
app/
├── _layout.tsx # Root: providers + Stack
├── (demo)/
│ ├── _layout.tsx # Tabs or Stack for demo scenes
│ ├── index.tsx # Home screen
│ └── [id].tsx # Detail screen
└── +not-found.tsx
导航
- 命令式:
const router = useRouter()→router.push('/detail/123')、router.back() - 声明式:
<Link href="/detail/123">组件 - 参数:
const { id } = useLocalSearchParams<{ id: string }>() - 重定向:使用
<Redirect href="/login" />实现条件路由
屏幕选项
通过布局或内联方式配置屏幕呈现:
- 在布局中:
<Stack.Screen name="detail" options={{ title: 'Detail', headerShown: false }} /> - 内联:
<Stack.Screen options={{ presentation: 'modal' }} /> - 常用选项:
title、headerShown、presentation('card' | 'modal')、animation
布局嵌套
在根布局中嵌套提供程序,在组布局中放置界面元素:
- 根目录的
_layout.tsx:GestureHandlerRootView、SafeAreaProvider、主题上下文、<Stack /> - 组目录的
_layout.tsx:配置屏幕选项和标题栏的<Tabs />或<Stack />
最佳实践
- 保持路由文件精简——将工作委派给
/components/views/中的视图组件 - 使用路由组划分职责,同时不影响 URL
- 使用泛型为路由参数指定类型:
useLocalSearchParams<{ id: string }>() - 使用自定义标题栏时设置
headerShown: false - 使用
<Stack screenOptions={{ animation: 'slide_from_right' }} />以统一转场效果 - 将共享提供程序(主题、数据上下文)放在根目录的
_layout.tsx中 - 使用
+not-found.tsx优雅地处理 404
反模式
- 在路由文件中放置业务逻辑(保持文件精简,并将工作委派给组件)
- 将路由组嵌套超过 2 层
- 直接使用 React Navigation,而不使用 Expo Router 抽象
- 在复杂应用中将导航路径硬编码为字符串,却没有使用常量文件
- 忘记在路由文件中导出默认组件(会导致屏幕空白)
- 将本应放在根布局中的提供程序放入组布局
评论
支持 Markdown