React Native使用@react-navigation/native配置页面路由

今天看到了探花交友的验证码输入完成后,需要根据是否是新用户,跳转不同的页面,但是,可以明显感觉到现有的路由配置不适合页面比较多的场景,扩展性并不好,每次都需要写到nav.js文件中,如果页面特别多的话,这个文件会特别大,多人合作的话,冲突也会比较多。

 参考Rn使用@react-navigation/native配置页面路由以及导航栏_51CTO博客_react native导航栏对现有的路由进行改造。

一、新建路由项目结构

 index.js存放我们的全部页面,StackNavigator.js存放我们目前的堆栈页面,TabNavigator.js存放我们的底部tab栏,这里我们没用到,暂时放这里。

二、代码改造

1、index.js存放我们的全部页面

import Login from '../pages/account/login';
import Demo from '../pages/Demo/Demo';

const router = [
  //   {
  //     name: 'Index', //跳转路径
  //     title: '明知山', //头部展示标题
  //     component: require('./TabNavigator').default,
  //   },
  //下面只需要配置非tabbar页面路径
  {
    name: 'Demo',
    title: 'Demo',
    component: Demo,
  },
  {
    name: 'Login',
    title: '登录',
    component: Login,
  },
];
export default router;

2、stackNavigator使用@react-navigation/native-stack配置路由

import React from 'react';
import {createNativeStackNavigator} from '@react-navigation/native-stack';
import {getFocusedRouteNameFromRoute} from '@react-navigation/native';
import router from './index';
import {isShowDemo} from '../constant/Limits';

const Stack = createNativeStackNavigator();

const StackNavigator = () => {
  //从子导航器获取路由名称
  const getChildTitle = route => {
    const routeNam
<think>好的,我现在要帮用户解决如何使用@react-navigation/native进行导航的问题。首先,我需要回忆一下用户提供的引用内容。引用1提到了使用@react-navigation/native自定义头部的示例代码,引用2详细说明了如何配置@react-navigation/stack@6.x,包括创建navigationRef和一些导航方法的封装。用户需要的是教程和示例代码,所以我的回答应该涵盖安装、基本配置、导航器类型、导航方法以及自定义头部等内容。 首先,我应该从安装步骤开始。需要安装@react-navigation/native及其依赖的react-native-screens和react-native-safe-area-context,还有@react-navigation/stack。接下来是基本的导航容器设置,用NavigationContainer包裹整个应用。然后,创建堆栈导航器,定义屏幕组件,比如HomeScreen和DetailsScreen,并用createStackNavigator来生成导航器。 然后,需要解释如何在不同屏幕之间进行导航,使用navigation.navigate方法,并传递参数。这部分需要示例代码,比如在HomeScreen中添加按钮跳转到DetailsScreen,并传递参数。同时,用户提到自定义头部,这里需要展示如何设置headerTitle或者使用headerShown来隐藏默认头部,或者自定义头部组件。引用1中的示例可能涉及自定义头部,所以需要结合这点,展示如何在options中设置自定义组件。 另外,引用2中提到了navigationRef的封装,允许在任何页面使用导航方法。这部分需要解释如何创建navigationRef,并在应用顶层使用,以及如何通过context访问导航方法。可能还需要说明如何在不通过props传递navigation的情况下进行导航,比如在非组件函数中调用导航。 还要注意用户可能遇到的常见问题,比如导航器未准备好导致的错误,引用2中的setTimeout和isReady检查就是处理这种情况的。需要提醒用户确保导航器准备就绪后再调用方法。 最后,生成相关问题,帮助用户深入理解,比如导航器类型的选择、参数传递的最佳实践、深层链接配置等。这些问题应该引导用户进一步探索相关主题,同时可能参考已有的引用内容。</think>以下是如何使用@react-navigation/native实现导航的详细教程,结合示例代码和最佳实践: ### 一、基础配置步骤 1. **安装依赖** ```bash yarn add @react-navigation/native yarn add react-native-screens react-native-safe-area-context yarn add @react-navigation/stack ``` 2. **创建导航容器** 在根组件中包裹应用: ```jsx import { NavigationContainer } from '@react-navigation/native'; export default function App() { return ( <NavigationContainer> {/* 导航结构 */} </NavigationContainer> ); } ``` 3. **创建堆栈导航器** ```jsx import { createStackNavigator } from '@react-navigation/stack'; const Stack = createStackNavigator(); function HomeScreen({ navigation }) { return ( <View> <Button title="跳转到详情页" onPress={() => navigation.navigate('Details')} /> </View> ); } function DetailsScreen() { return <View><Text>详情页内容</Text></View>; } function MyStack() { return ( <Stack.Navigator> <Stack.Screen name="Home" component={HomeScreen} /> <Stack.Screen name="Details" component={DetailsScreen} /> </Stack.Navigator> ); } ``` ### 二、自定义导航栏实现 通过`options`属性自定义头部: ```jsx <Stack.Screen name="Profile" component={ProfileScreen} options={{ headerTitle: props => <CustomHeader {...props} />, headerStyle: { backgroundColor: '#f4511e', }, headerTintColor: '#fff', }} /> ``` ### 三、全局导航方法封装 使用引用[2]的导航方法封装: ```jsx // navigationService.js import { createNavigationContainerRef } from '@react-navigation/native'; export const navigationRef = createNavigationContainerRef(); navigationRef.navigate = (name, params) => { if (navigationRef.isReady()) { navigationRef.dispatch( CommonActions.navigate({ name, params }) ); } }; // 任意组件中调用 import { navigationRef } from './navigationService'; navigationRef.navigate('Details'); ``` ### 四、参数传递示例 ```jsx // 传递参数 navigation.navigate('Details', { itemId: 86, title: 'Hello', }); // 接收参数 function DetailsScreen({ route }) { const { itemId, title } = route.params; } ``` ### 五、最佳实践 1. 使用`navigationRef`前必须检查`isReady()` 2. 深层链接配置需在`NavigationContainer`中处理 3. 复杂场景建议使用TypeScript定义路由参数类型 4. 页面切换动画可通过`screenOptions`统一配置
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值