Table of Contents
导言
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 最佳做法上的社区文章,以完善您的执行。