命令装置

// 装置根底包 ^6.0.6yarn add @react-navigation/native -S// 装置路由包 ^6.2.5yarn add @react-navigation/native-stack -S//RN版本0.65.1 React版本17.0.2"react": "17.0.2","react-native": "0.65.1",

路由配置

包援用

import { NavigationContainer, useNavigation } from '@react-navigation/native';import { createNativeStackNavigator } from '@react-navigation/native-stack';const Stack = createNativeStackNavigator<RootStackParamList>();const Navigator = Stack.Navigator;const Screen = Stack.Screen;

路由列表

// 路由页面配置<NavigationContainer>    <Stack.Navigator        initialRouteName={Views.Home}        screenOptions={{            headerShadowVisible: false, // android 导航去暗影            headerTitleAlign: 'center', // 题目居中            // 设置导航栏字体款式            headerTitleStyle: {                fontSize: 17,                color: '#333333',                fontFamily: 'PingFangSC-Semibold',                fontWeight: '700',            },            headerLeft: () => headerLeft(),        }}    >        <Stack.Screen            name={Views.Home}            component={Home}            options={{ title: '每日工作' }}        />        <Stack.Screen            name={Views.NewTask}            component={NewTask}            options={{ title: '老手工作' }}        />        <Stack.Screen            name={Views.Redeem}            component={Redeem}            options={{ title: '积分兑换' }}        />        <Stack.Screen            name={Views.Rule}            component={Rule}            options={{ title: '积分兑换规定' }}        />    </Stack.Navigator></NavigationContainer>

属性参数详解

Stack.Navigator

导航全局配置,再次配置的参数在所有路由页面的导航下面全副失效,具体属性如下

initialRouteName: //指定路由首页 类比React的跟路由页面// 用于导航器中屏幕的默认选项screenOptions: {    headerShadowVisible: false, // android 导航去暗影 默认true开启状态    headerTitleAlign: 'center', // 题目居中 默认 'left'    headerTitle: '题目', //全局题目 在此设置是不失效的 默认展现路由页面的name    // 设置导航栏字体款式    headerTitleStyle: {        fontSize: 17,        color: '#333333',        fontFamily: 'PingFangSC-Semibold',        fontWeight: '700',    },    headerTintColor: 'red', // 导航栏字体色彩设置 如果设置了headerTitleStyle则此处设置不失效    statusBarStyle: 'light' //"inverted" | "auto" | "light" | "dark" | undefined 状态栏配置    headerLeft: React.ReactNode, //导航左侧区域按钮配置 不配置默认展现左箭头返回图标    headerRight: React.ReactNode //导航右侧区域配置 默认无}

以上根底配置基本上能满足绝大多数业务的日常开发了

Stack.Screen

页面导航配置,此处的配置会笼罩全局配置,具体属性参数如下:

const Home = lazy(() => import('./views/home'));name= 'Home' //指定的路由页面的名称 必填属性component= Home // 路由React页面挂载 必填属性initialParams={{ itemId: 42 }} //页面初始化参数// 路由页面导航配置 此处的配置会笼罩全局的screenOptionsoptions={{   title: '积分兑换规定', //路由页面题目   headerLeft: React.ReactNode, //导航左侧区域按钮配置 不配置默认展现左箭头返回图标  headerRight: React.ReactNode //导航右侧区域配置 默认无}}

路由应用

因为新版本的RN基本上都采纳Hooks+TypeScript的形式来开发,在应用时好多都须要做类型申明

申明文件

首先增加一个全局申明文件,不便前面的自定义hooks(上面会具体介绍)的调用;

自己的工程开发目录如下:

首先在types上面加一个全局的ts申明文件index.ts 内容如下:

import { RouteProp } from '@react-navigation/native'; // 获取route的props// 枚举进去所有的路由页面的Nameexport enum Views {    Home = 'Home',    NewTask = 'NewTask',    Redeem = 'Redeem',    Rule = 'Rule',}interface NewTaskProps {    title: string;    action: string;    funcName: string;    params: any;}// 定义每个路由页面须要传达到下个页面的参数 在目标页面外面申明要承受的参数export type RootStackParamList = {    [Views.Home]: undefined;    [Views.NewTask]:        | {              /** @description 申明往子组件外面的传参 */              item: NewTaskProps;              callback: () => void;          }        | undefined;    [Views.Redeem]:        | {              /** @description 监听页面返回回调父页面 */ callback: () => void;          }        | undefined;    [Views.Rule]: undefined;};// 定义申明每个子路由界面接管的具体数据类型useRoute 前面详解应用export type RootRouteType = RouteProp<RootStackParamList>;// This registers which makes navigation fully type-safe.// https://reactnavigation.org/docs/typescript#specifying-default-types-for-usenavigation-link-ref-etc// 全局申明useNavigation自定义hooks办法的参数declare global {    namespace ReactNavigation {        interface RootParamList extends RootStackParamList {}    }}

自定义hooks

目前react-navigation提供了自定义hooks办法useNavigation、useRoute等,重点解说一下路由的应用

useNavigation

1、返回监听navigation.goBack()

import { useNavigation } from '@react-navigation/native';// 左侧返回按钮const headerLeft = () => {    // hooks外面获取导航器对象    const navigation = useNavigation();    return (        <TouchableOpacity            onPress={() => {                // 如果无奈在应用路由退出后 调用native协定敞开以后RN容器                navigation.canGoBack() ? navigation.goBack() : Alert.alert('路由首页');            }}        >            <Image                style={{                    height: 25,                    width: 25,                }}                source={require('./images/back.png')}            />        </TouchableOpacity>    );};

2、路由跳转navigation.navigate

import React, { FC } from 'react';import { useNavigation } from '@react-navigation/native';import { Views } from '@types'; //此处配置了alias 能够间接应用@const Home: FC = () => {  // 自定义hooks外面调用导航对象    const navigation = useNavigation();  // 一般不带参数跳转  const jumpNewTask = () => {    //不带参数的一般跳转 如果没有全局的ReactNavigation申明 按文档调用会报如下谬误一的问题    navigation.navigate(Views.NewTask);   }  // 带参数跳转  const jumpNewTask = () => {    //如果不再目标页面做入参的申明会有如下报错(谬误二)    navigation.navigate(Views.NewTask, {            item: {                title: '弹窗',                action: 'CSTShowDialog',                funcName: 'dialog',                params: {                    title: '舒适提醒',                    content: '请上传证件照,否则发帖须要扣费10元',                    btns: [                        { color: '#ff552e', text: '确定' },                        { color: '#000000', text: '勾销' },                    ],                },            },            callback: () => {                // 老手工作返回首页 拉取积分信息                getTaskInfo();            },        });   }}

报错一

报错二

3、重写导航navigation.setOptions

import React, { FC, useLayoutEffect, useEffect } from 'react';import { View, Text, TouchableOpacity } from 'react-native';import { useNavigation, useRoute } from '@react-navigation/native'const Redeem: FC = () => {  const navigation = useNavigation();    const headerRight = () => {        return (            <TouchableOpacity                onPress={() => {                    navigation.navigate(Views.Rule);                }}            >                <Text style={styles.headerRight}>兑换规定</Text>            </TouchableOpacity>        );    };    useLayoutEffect(() => {        navigation.setOptions({            headerRight: () => headerRight(),        });    }, []);}

4、路由页面内赋值参数navigation.setParams

import React, { FC, useLayoutEffect } from 'react';import { View, Text } from 'react-native';import { useNavigation } from '@react-navigation/native';const NewTask: FC = () => {  const navigation = useNavigation();  useLayoutEffect(() => {        // 初始化赋值        navigation.setParams({ testParam: 'test' });    }, []);}export default NewTask;// 页面内赋值个别要应用?:可选参数的形式申明 否则上个页面的路由跳转会报如下谬误//谬误申明[Views.NewTask]:        | {              /** @description 申明往子组件外面的传参 */              item: NewTaskProps;              testParam: string;              callback: () => void;          }        | undefined;// 正确的申明形式[Views.NewTask]:        | {              /** @description 申明往子组件外面的传参 */              item: NewTaskProps;              testParam?: string;              callback: () => void;          }        | undefined;

5、其余

其余API暂不做详解

useRoute

路由页面参数接管自定义hooks

1、路由参数接管route.params

import React, { FC, useLayoutEffect } from 'react';import { View, Text } from 'react-native';import { useNavigation, useRoute } from '@react-navigation/native';import { RootRouteType } from '@types';const NewTask: FC = () => {  const navigation = useNavigation();  // @react-navigation/native自定义hooks外面获取路由参数对象  // 谬误 未声明间接应用报错如下 图一  // const route = useRoute();  // 正确应用形式 先申明后应用RootRouteType如上types外面的申明  const route = useRoute<RootRouteType>();  useLayoutEffect(() => {        // 初始化赋值        navigation.setParams({ testParam: 'test' });        // 路由返回时触发调用父页面传入的callback办法,模仿路由回调            return () => {            route.params?.callback();        };    }, []);  // 路由参数获取   const getParams = () => {        // 页面获取到的路由参数如下:(图二所示)有父页面路由跳转的传参,有本页面类本人注册的路由页面参数testParam        const params = route.params;        console.log(params);    };}export default NewTask;

图一

图二

2、其余

总结

以上是自己业务开发中罕用的性能总结,有更深层次的应用,欢送留言;总结不易,转载请赋原文链接。