跳到主要内容

屏幕之间导航

移动应用程序很少只由一个屏幕组成。管理多个屏幕的呈现和转换通常由所谓的导航器处理。

本指南涵盖 React Native 中可用的各种导航组件。如果你刚开始接触导航,你可能想使用React Navigation。React Navigation 提供了一个简单的导航解决方案,能够在 Android 和 iOS 上呈现常见的堆栈导航和标签导航模式。

如果你将 React Native 集成到已原生管理导航的应用程序中,或者正在寻找 React Navigation 的替代方案,以下库在两个平台上提供原生导航:react-native-navigation

React Navigation

社区导航解决方案是一个独立的库,允许开发者用几行代码设置应用程序的屏幕。

入门模板

如果你要启动一个新项目,你可以使用 React Navigation 模板通过 Expo 快速设置一个新项目

shell
npx create-expo-app@latest --template react-navigation/template

有关如何开始的更多信息,请参阅项目的 README.md

安装和设置

首先,你需要将它们安装到你的项目中

shell
npm install @react-navigation/native @react-navigation/native-stack

接下来,安装所需的对等依赖项。你需要运行不同的命令,具体取决于你的项目是 Expo 管理项目还是裸 React Native 项目。

  • 如果你有一个 Expo 管理项目,请使用 expo 安装依赖项

    shell
    npx expo install react-native-screens react-native-safe-area-context
  • 如果你有一个裸 React Native 项目,请使用 npm 安装依赖项

    shell
    npm install react-native-screens react-native-safe-area-context

    对于带有裸 React Native 项目的 iOS,请确保你已安装 CocoaPods。然后安装 pods 以完成安装

    shell
    cd ios
    pod install
    cd ..

安装并配置好依赖项后,你就可以开始设置项目以使用 React Navigation 了。

使用 React Navigation 时,你在应用程序中配置导航器。导航器处理应用程序中屏幕之间的转换,并提供 UI,例如标题、标签栏等。

现在你已准备好在设备/模拟器上构建并运行你的应用程序。

用法

现在你可以创建一个包含主屏幕和个人资料屏幕的应用程序

tsx
import * as React from 'react';
import {createStaticNavigation} from '@react-navigation/native';
import {createNativeStackNavigator} from '@react-navigation/native-stack';

const RootStack = createNativeStackNavigator({
screens: {
Home: {
screen: HomeScreen,
options: {title: 'Welcome'},
},
Profile: {
screen: ProfileScreen,
},
},
});

const Navigation = createStaticNavigation(RootStack);

export default function App() {
return <Navigation />;
}

在此示例中,RootStack 是一个包含 2 个屏幕(HomeProfile)的导航器,在 createNativeStackNavigatorscreens 属性中定义。同样,你可以定义任意数量的屏幕。

你可以在每个屏幕的 options 属性中为每个屏幕指定选项,例如屏幕标题。每个屏幕定义还需要一个 screen 属性,它是一个 React 组件或另一个导航器。

在每个屏幕组件内部,你可以使用 useNavigation 钩子来获取 navigation 对象,该对象具有各种链接到其他屏幕的方法。例如,你可以使用 navigation.navigate 转到 Profile 屏幕

tsx
import {useNavigation} from '@react-navigation/native';

function HomeScreen() {
const navigation = useNavigation();

return (
<Button
title="Go to Jane's profile"
onPress={() =>
navigation.navigate('Profile', {name: 'Jane'})
}
/>
);
}

function ProfileScreen({route}) {
return <Text>This is {route.params.name}'s profile</Text>;
}

native-stack 导航器使用原生 API:iOS 上的 UINavigationController 和 Android 上的 Fragment,因此使用 createNativeStackNavigator 构建的导航将具有与基于这些 API 原生构建的应用程序相同的行为和相似的性能特征。

React Navigation 还提供用于不同类型导航器(例如选项卡和抽屉)的包。你可以使用它们在应用程序中实现各种模式。

有关 React Navigation 的完整介绍,请遵循React Navigation 入门指南