关于 expo-router
expo-router 是一组用于 Expo Router 的导航实现模式,面向构建应用导航的开发者。它介绍基于文件结构自动发现路由、布局配置及原生标签栏的用法。
主要功能
- 01按文件结构自动发现路由
- 02通过布局文件定义导航结构
- 03配置 Stack 默认选项
- 04在单个屏幕设置导航选项
- 05使用原生标签栏与 SF Symbols
适用场景
- 01为应用配置 Stack 导航
- 02按目录组织标签页和路由组
- 03设置特定屏幕的标题或选项
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ jchaselubitz/ drill-app --skill expo-router安装后在 Claude Code 中输入/expo-router确认已加载。
附带文件meta.yaml
详细介绍
Expo Router 模式
Stack 导航器配置
根布局设置
在 Stack 组件上使用 screenOptions 为所有屏幕设置默认选项。不要显式列出每个屏幕——路由会根据文件结构自动发现。
// app/_layout.tsx
import { Stack } from 'expo-router';
export default function RootLayout() {
return (
<Stack screenOptions={{ headerShown: false }} />
);
}
单个屏幕配置
各个屏幕可在组件文件中使用 <Stack.Screen> 配置自己的选项:
// app/lesson/[id].tsx
import { Stack } from 'expo-router';
export default function LessonScreen() {
return (
<View>
<Stack.Screen
options={{
title: 'Lesson',
headerShown: true,
headerBackTitle: 'Back',
}}
/>
{/* Screen content */}
</View>
);
}
动态配置标题栏
使用 useNavigation 和 setOptions 设置按钮等动态标题栏内容:
import { useNavigation } from 'expo-router';
import { useLayoutEffect } from 'react';
export default function Screen() {
const navigation = useNavigation();
useLayoutEffect(() => {
navigation.setOptions({
headerRight: () => (
<Pressable onPress={handlePress}>
<Ionicons name="add" size={28} />
</Pressable>
),
});
}, [navigation]);
return <View>{/* content */}</View>;
}
原生标签页(expo-router/unstable-native-tabs)
原生标签页提供平台原生的标签栏,并在 iOS 上使用 SF Symbols:
// app/(tabs)/_layout.tsx
import { Icon, Label, NativeTabs } from 'expo-router/unstable-native-tabs';
export default function TabLayout() {
return (
<NativeTabs>
<NativeTabs.Trigger name="index" options={{ title: 'Home' }}>
<Icon sf="house.fill" drawable="custom_android_drawable" />
<Label>Home</Label>
</NativeTabs.Trigger>
</NativeTabs>
);
}
关键原则
- 基于文件的路由:路由会根据
app/目录结构自动发现 - 最简配置:只配置需要覆盖的选项
- 屏幕级选项:屏幕在组件中使用
<Stack.Screen>配置自己的标题栏和选项 - 布局文件:
_layout.tsx文件定义其所在目录的导航结构 - 路由组:圆括号(例如
(tabs))会创建路由组,但不会影响 URL 路径
应避免的常见错误
- 不要在 Stack 中显式列出每个屏幕——它们会自动发现
- 不要使用
screenOptions设置特定路由的选项——应在路由文件中使用<Stack.Screen> - 不要深度嵌套导航器——使用基于文件的路由可让结构更清晰
评论
支持 Markdown