This documentation is available as Markdown for AI agents and LLMs. See the full Markdown index or append .md to any documentation URL.
添加导航
编辑页面
在本章中,学习如何向 Expo 应用添加导航。
在本章中,我们将学习 Expo Router 的基础知识,创建堆栈导航和一个包含两个标签页的底部标签栏。

使用 Expo Router 设置基于文件的路由,在屏幕之间创建堆栈导航,并构建一个底部标签栏。
Expo 路由基础
Expo Router 是一个面向 React Native 和 Web 应用的基于文件的路由框架。它负责管理屏幕之间的导航,并在多个平台上使用相同的组件。要开始使用,我们需要了解以下约定:
- app directory:一个仅包含路由及其布局的特殊目录。添加到此目录中的任何文件都会成为原生应用中的屏幕和 Web 上的页面。在默认模板中,它位于 src/app。
- Root layout:src/app/_layout.tsx 文件。它定义了共享的 UI 元素,例如标题和标签栏,以便它们在不同路由之间保持一致。
- File name conventions:Index 文件名(例如 index.tsx)与其父目录匹配,不会添加路径片段。例如,src/app 目录中的 index.tsx 文件匹配
/路由。 - route 文件将 React 组件作为其默认值导出。它可以使用
.js、.jsx、.ts或.tsx扩展名。 - Android、iOS 和 Web 共享统一的导航结构。
以上列表已经足够我们开始使用。有关完整功能列表,请参阅 Expo Router 简介。
1
2
在屏幕之间导航
我们将使用 Expo Router 的 Link 组件从 /index 路由导航到 /about 路由。它是一个 React 组件,会根据给定的 href 属性渲染一个 <Text>。
- 在 src/app/index.tsx 中从
expo-router导入Link组件。 - 在
<Text>组件后添加一个Link组件,并传入指向/about路由的href属性。 - 为
Link组件添加fontSize、textDecorationLine和color样式。它接受与<Text>组件相同的属性。
让我们看看应用中的变化。点击 Link 即可导航到 /about 路由:
3
添加一个找不到页面路由
当路由不存在时,我们可以使用 +not-found 路由来显示一个回退屏幕。这在我们希望在移动端导航到无效路由时显示自定义屏幕,而不是让应用崩溃,或者在 Web 上显示 404 错误时非常有用。Expo Router 使用一个特殊的 +not-found.tsx 文件来处理这种情况。
- 在 src/app 目录中创建一个名为 +not-found.tsx 的新文件,以添加
NotFoundScreen组件。 - 从
Stack.Screen添加options属性,为此路由显示自定义屏幕标题。 - 添加一个
Link组件,以导航到/路由,也就是我们的回退路由。
要测试这一点,请在 Web 浏览器中访问 http:localhost:8081/123 URL,因为在那里更容易更改 URL 路径。应用应该会显示 NotFoundScreen 组件:
4
添加底部标签导航器
此时,我们的 src/app 目录文件结构如下所示:
srcapp_layout.tsxRoot layoutindex.tsxmatches route '/'about.tsxmatches route '/about'+not-found.tsxmatches route any 404 route我们将为应用添加一个底部标签导航器,并复用现有的 Home 和 About 屏幕来创建一个标签布局(这是许多社交媒体应用中常见的导航模式,例如 X 或 BlueSky)。我们还会在根布局中继续使用堆栈导航器,这样 +not-found 路由就会显示在任何其他嵌套导航器之上。
- 在 src/app 目录中添加一个 (tabs) 子目录。这个特殊目录用于将路由组合在一起,并在底部标签栏中显示这些路由。
- 在该目录中创建一个 (tabs)/_layout.tsx 文件。它将用于定义标签布局,该布局独立于根布局。
- 将现有的 index.tsx 和 about.tsx 文件移入 (tabs) 目录。src/app 目录的结构如下所示:
srcapp_layout.tsxRoot layout+not-found.tsxmatches route any 404 route(tabs)_layout.tsxTab layoutindex.tsxmatches route '/'about.tsxmatches route '/about'更新根布局文件,添加一个 (tabs) 路由:
在 (tabs)/_layout.tsx 中,添加一个 Tabs 组件来定义底部标签布局:
让我们现在看看应用,看看新的底部标签:
5
6
更新底部标签导航器外观
现在,底部标签导航器在所有平台上的外观都相同,但并不符合我们应用的风格。例如,标签栏或标题没有显示自定义图标,底部标签栏背景颜色也与应用的背景颜色不一致。
修改 src/app/(tabs)/_layout.tsx 文件,为标签栏添加图标:
- 从
@expo/vector-icons导入Ionicons图标集——这是一个包含常用图标集的库。 - 为
index和about两个路由都添加tabBarIcon。这个函数接收focused和color作为参数,并渲染图标组件。通过图标集,我们可以指定自定义的图标名称。 - 为
Tabs组件添加screenOptions.tabBarActiveTintColor,并将其值设为#ffd33d。这样会在标签处于激活状态时更改其图标和标签的颜色。
我们再通过 screenOptions 属性更改标签栏和标题的背景颜色:
在上面的代码中:
- 使用
headerStyle属性将标题背景设置为#25292e。我们还使用headerShadowVisible禁用了标题阴影。 headerTintColor将#fff应用于标题文字tabBarStyle.backgroundColor将#25292e应用于标签栏
现在,我们的应用已经有了一个自定义的底部标签导航器:
概要
Chapter 2: Add navigation
We've successfully added a stack and a tab navigator to our app.
In the next chapter, we'll learn how to build the app's first screen.