导言

React Information 启用了 JavaScript 和 React 的本地移动应用程序。 移动应用程序开发的一个重要方面是导航: 引导用户通过不同的屏幕和特性无缝地进行。 [[FLT: 0]] React Naving [[FLT: 1] 是 React Information 应用程序中最受欢迎, 社区驱动的导航库。 它提供了一个声明性 API, 支持堆栈、 标签和抽屉导航器, 并处理平台特定手势和转换。 这个指南涵盖了从安装到深连接和认证流等高级模式的所有内容。

先决条件和安装

在使用 React 导航之前, 请确保您有一个 React 本地项目初始化 。 如果您正在启动新项目, 请使用 React 本地 CLI 或 Expo。 React 导航可以同时使用 。

安装核心软件包

通过 npm 或 纱线安装所需的软件包。 核心库及其主要依赖性为:

npm install @react-navigation/native

然后安装支持的库, 用于屏幕管理和安全区域处理 :

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

如果您正在使用 Expo , 这些库已经包含。 对于 赤裸的 React 土著项目, 请遵循官方文档中的链接指令, 以确保本地模块正确链接( 自动链接操作器用于 React 土著 0. 60+ ) 。

安装导航器

React Navigation 提供了多个导航器。推荐大多数使用的案例为 内存堆栈导航器 :

npm install @react-navigation/native-stack

其他导航器如底盘德拉维尔[]分别安装:

npm install @react-navigation/bottom-tabs
npm install @react-navigation/drawer

核心概念

反应导航围绕三个主要组成部分构建:

  • Navigation Container – 最外层的包件,管理导航树和状态.
  • Navigators – 定义导航模式的组件(上,制表,抽屉).
  • Screens – 代表应用中视图或页面的单个组件.

每个导航设置都必须用]包起来,这个容器一般放在应用组件的根部.

设置堆栈导航

堆栈导航器管理着一个最后的第一堆屏幕。它默认使用本地平台的过渡动画和手势。

首先,导入必要的模块:

import { NavigationContainer } from '@react-navigation/native';
import { createNativeStackNavigator } from '@react-navigation/native-stack';

创建堆栈导航实例 :

const Stack = createNativeStackNavigator();

定义 App 组件中的导航器 :

function App() {
 return (
 <NavigationContainer>
 <Stack.Navigator>
 <Stack.Screen name="Home" component={HomeScreen} />
 <Stack.Screen name="Details" component={DetailsScreen} />
 </Stack.Navigator>
 </NavigationContainer>
 );
}

每个都需要一个]道具(用于导航)和一个道具(要渲染的反射组件)。

创建屏幕和导航

屏幕是标准反射组件。 它们得到两个重要的道具: 和 。 对象提供了屏幕之间移动的方法。 下面是典型的家屏幕 :

function HomeScreen({ navigation }) {
 return (
 <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
 <Text>Home Screen</Text>
 <Button
 title="Go to Details"
 onPress={() => navigation.navigate('Details')}
 />
 </View>
 );
}

细节屏幕不需要使用导航道具,除非它需要进一步导航.

function DetailsScreen({ route }) {
 return (
 <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
 <Text>Details Screen</Text>
 </View>
 );
}

导航方法

反应导航通过道具提供几种方法:

  • navigate(名称,params) – 移动到屏幕上,如果在堆栈中存在,则重用已有实例.
  • push(名称,params) – 总是将新屏幕推到堆栈上,即使同一屏幕已经放在堆栈中.
  • goBack() –在堆栈中导航到前一个屏幕.
  • 替换(名称,params) – 将当前屏幕替换为新屏幕,从历史中移除当前.
  • 重置(状态) –将整个导航状态重置到给定状态对象.

例如,要推动一个“细节”屏幕和通过参数的新实例:

navigation.push('Details', { itemId: 42, otherParam: 'anything' });

屏幕之间传递参数

数据可以通过第二个参数传递到屏幕上,从而或]。接收的屏幕通过访问这些参数。

// In HomeScreen
navigation.navigate('Details', { userId: 123 });

// In DetailsScreen
function DetailsScreen({ route }) {
 const { userId } = route.params;
 return <Text>User ID: {userId}</Text>;
}

在屏幕组件上使用 设定默认参数值 :

<Stack.Screen
 name="Details"
 component={DetailsScreen}
 initialParams={{ itemId: 0 }}
/>

配置导航选项

每个屏幕都可以自定义其头,标签图标,抽屉标签等,在导航器上使用[]道具或道具.

标题自定义

<Stack.Screen
 name="Details"
 component={DetailsScreen}
 options={{
 title: 'Details',
 headerStyle: { backgroundColor: '#f4511e' },
 headerTintColor: '#fff',
 headerTitleStyle: { fontWeight: 'bold' },
 }}
/>

动态选项可以使用一个接收 的函数设置 :

options={({ route }) => ({ title: route.params.name })}

标签导航

Tab 导航在顶级应用部分很常见。 安装底端标签导航器 :

npm install @react-navigation/bottom-tabs

创建标签导航器并将其与您的堆栈合并 :

import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';

const Tab = createBottomTabNavigator();

function HomeTabs() {
 return (
 <Tab.Navigator>
 <Tab.Screen name="Feed" component={FeedScreen} />
 <Tab.Screen name="Profile" component={ProfileScreen} />
 </Tab.Navigator>
 );
}

您可以将标签导航器嵌入到堆栈导航器中, 也可以反之。 自定义标签图标时使用 ] 道具, 并使用 ] 。

绘图导航

抽屉导航器从左边滑出一个抽屉,显示导航项目。安装它:

npm install @react-navigation/drawer

示例设置 :

import { createDrawerNavigator } from '@react-navigation/drawer';

const Drawer = createDrawerNavigator();

function AppDrawer() {
 return (
 <Drawer.Navigator>
 <Drawer.Screen name="Home" component={HomeScreen} />
 <Drawer.Screen name="Settings" component={SettingsScreen} />
 </Drawer.Navigator>
 );
}

使用]程序打开和关闭抽屉。

嵌入式导航器

复杂的应用经常会给一个母导航器调用方法(例如堆栈导航器内的标签导航器)。反射导航器会优雅地处理筑巢。向任何屏幕提供的道具,如果需要,可以调用母导航器。使用 调用母导航器的方法。

示例:包含标签导航器和设置屏幕的堆栈 :

function RootStack() {
 return (
 <Stack.Navigator>
 <Stack.Screen name="Main" component={MainTabs} options={{ headerShown: false }} />
 <Stack.Screen name="Settings" component={SettingsScreen} />
 </Stack.Navigator>
 );
}

连接和深层链接

React Navigation 支持深层链接处理打开特定屏幕的 URL。 在 上配置 道具 :

const linking = {
 prefixes: ['myapp://', 'https://myapp.com'],
 config: {
 screens: {
 Home: 'home',
 Details: 'details/:itemId',
 },
 },
};

<NavigationContainer linking={linking}>
 {/* navigators */}
</NavigationContainer>

然后处理收到的 URL。 这样可以让像按下通知这样的功能连接到特定的屏幕 。

认证流程

许多应用需要基于认证状态的有条件导航. 一个常见的模式是在根位切换导航器:

function App() {
 const [isSignedIn, setIsSignedIn] = useState(false);

 return (
 <NavigationContainer>
 {isSignedIn ? <AppNavigator /> : <AuthNavigator />}
 </NavigationContainer>
 );
}

或者,使用带有条件屏幕的单叠。通过保持承诺或状态更新来避免闪烁。

业绩和最佳做法

  • 使用 内置堆栈导航器[(而不是]]),以更好地进行性能和本土过渡.
  • 将同时挂载的屏幕数量最小化。 默认情况下, 重新启用隐藏的屏幕, 用于堆栈导航器, 但对于标签导航器, 您可以配置懒惰的加载 。
  • 仅通过参数传递原始数据,以避免序列化问题.
  • 用于经常重报的屏幕组件使用或].
  • 在导航过渡期间避免重计算;卸载工作与]。
  • 总是处理未保存的更改提示事件 [[FLT: 48]]。

结论

React Navigation 提供了一种直观,可定制,可执行的方式来管理 React Natural apps 中的导航。通过掌握堆栈,制表,抽屉和嵌套导航器,以及参数通过,深链接,认证流,您可以建立强大的移动体验。详细情况请参考 官方 React Navigation 文件[ 本地导航指南[。同时考虑阅读 React Navign 最佳做法上的社区文章,以完善您的执行。