基于React Navigation的拦截器封装

9.React Native之Fetch网络请求封装; 目录 1.Fetch介绍 2.fetch参数介绍 2.1Request 2.2Headers 2.3Response 2.4Body 3.Fetch使用介绍 3.1上传JSON 4.fetch封装 1.Fetch介绍 Fetch核心在于对HTTP的抽象,包括 Request,Response,Headers,Body,以及用于初始化异步请求的 global fetch。Fet... 阅读详情

运行环境

React Navigation 6.x
React Native >= 0.63.0
Node > 12

代码参考

npm地址
github地址:lib文件夹为库项目、demo文件夹为示例

React Navigation介绍

React Navigation为React Native提供的路由管理库,利用该库可以很好的管理页面跳转,及导航栏的配置。利用该库可以实现普通的页面跳转,但是在涉及拦截器使用的时候,实现起来就比较麻烦。我们举例说明一下,假如我们程序有如下几个页面

|-- pages
	|-- login.js 登录页面
	|-- record.js 我的订单页面
	|-- buy.js 购买页面
	|-- home.js 首页

我的订单跟购买页面需要依赖用户登录成功才能进入,那么我们常规的操作是通过标识来实现的,如下代码所示
pages/home.js

import React from 'react';
import { Button } from 'react-native';
class Home extends React.Component{
	render(){
	  return (
      <View style={styles.container}>
        <Button title="我的订单" onPress={() => this.props.navigation.navigate('login'), {toPage: "/record"}} />
        <Button title="购买" onPress={() => this.props.navigation.navigate('login'), {toPage: "/buy"}} />
      </View>
    );
	}
}

如上所示,通过传递toPage来标识登录成功后,跳转的页面,如下修改登录页面,pages/login.js

import React from 'react';
import { Button } from 'react-native';
class Login extends React.Component{
	login(){
		...扒拉扒拉一顿登录操作
	    const { toPage } = this.props.route.params;
	    this.props.navigation.navigate(toPage);
	}

	render(){
	  return (
	      <View style={styles.container}>
	        <Button title="我的订单" onPress={this.login} />
	      </View>
      );
	}
}

从以上可以看出,非常繁琐,而且代码非常耦合,有没有更好的解决方案,答案是有的,也就是拦截器的概念,通过配置拦截器让页面只需关系自己业务功能就行了。

如何设计拦截器

先看下React Navigation是怎么配置路由表的,app.js如下所示:

import { NavigationContainer } from '@react-navigation/native';
import { createStackNavigator } from '@react-navigation/stack';
import { Home } from './pages/home';
import { Login } from './pages/login';
import { Record } from './pages/record';
import { Buy } from './pages/buy';
const Stack = createStackNavigator();

function App() {
  return (
    <NavigationContainer>
      <Stack.Navigator>
        <Stack.Screen name="/home" component={Home} />
        <Stack.Screen name="/login" component={Login} />
        <Stack.Screen name="/record" component={Record} />
        <Stack.Screen name="/buy" component={Buy} />
      </Stack.Navigator>
    </NavigationContainer>
  );
}

export default App;

如何设置路由表

首先,我们需要有个路由表,然后根据路由表解析成React Navigation认识的形式,也就是上面的代码。新增路由表route-config.js,代码如下

import { Home } from './pages/home';
import { Login } from './pages/login';
export default {
	"/home":{
		component: Home
	},
	"/login":{
		component: Login
	}	
}

从上面的路由可以看到路由的路径是以 ‘/’ 开头的,做过Web应该比较熟悉,对以后做三端(Android、iOS、Web)重构也是适配的。

然后解析成React Navigation认识的格式:

import { NavigationContainer } from '@react-navigation/native';
import { createStackNavigator } from '@react-navigation/stack';
const Stack = createStackNavigator();
import routeConfig from './route-config'

function App() {
  return (
    <NavigationContainer>
      <Stack.Navigator>
            {
              Object.keys(routeConfig).map((key) => {
              	  const item = routes[key];
                  return <Stack.Screen name={key} component={item.component} key={key}/>
            }
      </Stack.Navigator>
    </NavigationContainer>
  );
}

export default App;

如何配置拦截器

路由表已经有了,接着思考如何加上拦截器,考虑到一个页面有多个拦截器的可能性,所以拦截器应该是一个数组,拦截器在一开始就能确定,所以修改route-config.js,如下所示

import { Home } from './pages/home';
import { Login } from './pages/login';
import { Record } from './pages/record';//我的订单
import { LoginInterceptor } from './interceptors/login-interceptor';//登录拦截器

export default {
	"/home":{
		component: Home
	},
	"/record":{
		interceptors:[
			{
				clazz: LoginInterceptor
			}
		]
		component: Record
	}
}

拦截器写好,以上逻辑为进入我的订单路由 /record 会先检验登录拦截器,也就是判断用户有没有登录,没有登录的话,会先在登录拦截器里面跳转到登录页面。登录拦截器代码如下:

class LoginInterceptor {
  intercept() {
    if(已登录){
      跳转到下一个拦截器或到目标页
    }else {
      跳转到登录页面
    }
  }
}

intercept为拦截函数

如何才能执行拦截器

这一步,首先我们得先用个管理类,来管理包裹React Navigation的跳转方法,等拦截器执行结束在执行跳转到目标页面。所以新增lib/router.js。

export class Router {
	// name为路由如/record,params为参数
	push(name, params){}
}

Router 需要拿到React Navigation的ref,才能跳转,修改app.js。

import { NavigationContainer } from '@react-navigation/native';
import { createStackNavigator } from '@react-navigation/stack';
import routeConfig from './route-config'
import { navigationRef } from './router';

const Stack = createStackNavigator();

function App() {
  return (
    <NavigationContainer ref={navigationRef}>
      <Stack.Navigator>
            {
              Object.keys(routeConfig).map((key) => {
              	  const item = routes[key];
                  return <Stack.Screen name={key} component={item.component} key={key}/>
            }
      </Stack.Navigator>
    </NavigationContainer>
  );
}

修改lib/router.js,涉及拦截过滤器模式

import { createNavigationContainerRef } from '@react-navigation/native';
import { StackActions, CommonActions } from '@react-navigation/native';
import { FilterManager } from './filter-manager';
import routeResolve from './route-resolve';
import routeConfig from './route-config'

export class Router {
  constructor() {
    this.filterManager = {};
    this.startLen = 0;
  }	

  //跳转函数	
  push(name, params){
      // 声明目标函数
      function targetFun() {
        const pushAction = StackActions.push(name, params);
        navigationRef.dispatch(pushAction);
      }
      this.execute(name, targetFun);
  }
  
  execute(name, targetFun) {
  	
    let route = routeConfig[name];

    if (route) {
      const interceptors = route.interceptors;

      if (interceptors) {
        let interceptorClazzs = [];
        interceptors.forEach(element => {
          interceptorClazzs.push(element["clazz"]);
        });

        const state = navigationRef.getState();
        this.startLen = state ? state.routes.length : 1;

		// 过滤管理器
        this.filterManager = new FilterManager(interceptorClazzs, targetFun);
        this.filterManager.execute();

      } else {
        targetFun();
      }
    }
  }

  /**
   * 执行下一个拦截器
   */
  interceptNext() {
    this.clearStack();
    this.filterManager.execute();
  }

  /**
   * 清栈
   */
  clearStack() {
    navigationRef.dispatch(state => {
      const routes = state.routes.filter((r, index) => {
        return index < this.startLen;
      });

      return CommonActions.reset({
        ...state,
        routes,
        index: routes.length - 1,
      });
    });
  }
}

export const navigationRef = createNavigationContainerRef();
export let router = new Router();

新增过滤管理器 lib/filter-manager.js

/**
 * 拦截过滤管理器
 */
export class FilterManager {
  constructor(interceptorClazzs, targetFun) {
    this.index = 0;
    this.targetFun = targetFun;
    this.interceptorClazzs = interceptorClazzs;
  }

  /**
   * 执行拦截器
   */
  execute(){
    if(this.index == this.interceptorClazzs.length){
      // 执行目标函数	
      this.targetFun();
    }else{
      // 获取下一个拦截器
      let interceptor = new this.interceptorClazzs[this.index]();
      this.index++;
      interceptor.intercept();
    }
  }
}

至此,拦截器的设计就完成了,可以愉快的调用了。

使用router跳转

修改Home页面的跳转,对应的就会调起登录拦截器

import React from 'react';
import { Button } from 'react-native';
import { router } from './lib/router';
class Home extends React.Component{
	render(){
	  return (
      <View style={styles.container}>
        <Button title="我的订单" onPress={() => router.push('/record')} />
        <Button title="购买" onPress={() => router.push('/buy')} />
      </View>
    );
	}
}
React Native实战:从零到一构建跨平台移动应用的全流程指南 跨平台移动开发是当前移动应用开发领域的重要技术方向,它旨在通过一套代码同时适配iOS和Android两大主流平台,从而显著提升开发效率并降低维护成本。其核心原理在于利用JavaScript运行时环境与原生平台之间的桥接机制,将JavaScript代码转换为原生组件进行渲染,在保证接近原生性能体验的同时,实现了前端开发的高效与灵活性。这一技术为需要快速迭代、兼顾多端体验且希望控制开发成本的团队带来了巨大价值,尤其适用于电商、社交、内容资讯等业务场景。在具体实践中,React Native作为主流框架,其项目搭 阅读详情

相关推荐

React Native搭建环境:移动电商应用实战案例

详解React Native搭建环境的完整流程,结合移动电商应用实战案例,帮助开发者快速上手跨平台开发,提升效率。掌握react native搭建环境与实际项目集成的关键步骤。

weixin_42575109的博客 774

react-navigation 路由级登录拦截

// 路由栈 const Navigator = StackNavigator({ Setting: {screen: SettingSCreenView}, .... }); 1、设置路由状态改变拦截 function getCurrentRouteName(navigationState) { if (!navigationState) { ...

zww学习笔记 6739

App开发中期实战复盘:Hermes Studio从0到50%的技术路线与部署经验

移动应用开发涉及技术选型、前后端协作与工程化落地,跨端框架和轻量后端是当前主流组合。以React Native搭配TypeScript构建应用层,用Node.js与Express提供接口服务,并以MySQL存储核心数据,形成一套完整且易维护的中小型团队技术栈。Token安全存储、接口契约冻结、本地缓存策略和离线体验优化,是保障业务稳定性的关键环节。在部署层面,利用宝塔面板配合Nginx反向代理和PM2进程守护,可高效完成后端上线;同时,模拟器网络差异、证书过期、抓包失败等问题也值得提前排雷。本文以Herme

weixin_34160277的博客 423

react实现路由跳转拦截功能(导航守卫)

react实现路由跳转拦截功能背景Prompt组件Prompt组件介绍 背景 最近接到一个需求,当用户将要离开指定页面的时候,需要拦截页面的跳转,并弹出提示框,提醒用户去做某一项操作(比如数据的保存和提交),只有当用户完成操作之后,或者关闭提示窗,才能离开此页面进行下一页面的跳转。 这样的需求,通常做法是:监听路由的跳转操作,阻塞跳转,实现拦截,并在用户处理完需要的操作之后(如数据保存、提交、关闭弹窗),才放开跳转权限,允许用户跳转下一页面。 Prompt组件 如果前端项目是使用vue来编写,我们可以很快处

博哥的二进制世界 1万+

LiveKit 本地部署实战:从零搭建安全实时通信环境(Caddy+HTTPS)

本文详细介绍了如何从零开始搭建LiveKit本地部署环境,结合Caddy服务器实现HTTPS安全通信。通过环境准备、证书生成、服务配置到前端客户端集成的完整流程,帮助开发者快速构建实时音视频应用,特别适合需要安全实时通信的场景。

weixin_29227585的博客 681

数学建模更新10(蒙特卡罗模拟)

蒙特卡罗模拟一.目录二.引例1:布丰投针实验1.投针步骤2.思路3. 历史实验者二.蒙特卡罗模拟概述1.定义2.提出3.原理4.讨论三.应用实例1.三门问题【1】问题【2】代码2.模拟排队问题【1】题目【2】引入参数【3】总结题目信息【4】过程可视化【5】一些推导公式【6】代码3.有约束的非线性规划问题【1】问题的分类【2】例子【3】推导过程【4】代码 一.目录 二.引例1:布丰投针实验 1.投针步骤 步骤: 1:取一张白纸,在上面画出许多条间距为a的平行线 2:去一根长度为l的针,随机的向纸张上投掷n次

沉晨尘宸的博客 3043

vue3.x+vite+element-plus+vuex+typescript

vue3.x+vite+element+vuex 环境准备:nodejs>12.0 npm>6.0 1.下载模板vue-ts npm init vite@latest my-vue-typescript --template vue-ts cd my-vue-typescript npm run dev 2.配置一下host 3.安装element-plus npm install element-plus --save or yarn add element-plus 4.导入elem

weixin_50923296的博客 830

PotPlayer终极画质调校:深入MadVR渲染器设置,让你的显示器发挥100%潜力

本文深入探讨了如何通过MadVR渲染器优化PotPlayer的画质设置,充分发挥高端显卡和显示器的潜力。从色彩空间匹配、色深优化到HDR元数据处理,提供了一套完整的配置指南,帮助用户实现影院级视觉体验。特别适合拥有NVIDIA RTX或AMD RX系列显卡的用户进行精细调校。

weixin_42530458的博客 601

【react】react路由拦截(路由守卫)

最近在做项目时候,遇到了返回时候如果用户没有保存表单,需要拦截路由跳转,并给出提示信息是否要退出。相信做过vue项目的小伙伴都对vue的路由守卫并不陌生,react中如何实现呢?(本分享是针对react-router的v5版本)

hzxOnlineOk的博客 1891

通达信波段交易公式实战:如何用副图指标精准捕捉买卖点(附完整源码)

本文深入解析通达信波段交易副图指标的构建与应用,提供完整源码实现,帮助投资者精准捕捉买卖点。通过趋势强度度量、超买超卖判断及信号过滤机制,结合K线图分析,有效提升波段交易的成功率。

weixin_29306317的博客 606

NXOpenC#-通用NX对象操作Tag,Handle,TaggedObject介绍

NXOpenC#-通用NX对象操作Tag,Handle,TaggedObject介绍

阿飞2018 1185

React Native中HTTP请求与导航跳转的整合实践

在移动应用开发中,网络请求与页面导航是两个基础且频繁使用的功能模块。HTTP请求作为客户端与服务器交互的核心方式,通过异步通信实现数据获取与提交。React Navigation作为React Native生态的主流路由解决方案,提供了跨平台一致的导航体验。当需要先获取数据再跳转页面时,正确处理异步操作与导航生命周期的关系至关重要。本文以React Navigation 6.x为例,详细解析如何实现类型安全的请求后跳转方案,包括导航器初始化、时序控制、错误处理等关键环节,并分享企业级项目中的拦截器集成与性能

weixin_33901926的博客 469

ADS基础教程23 - 有限元电磁仿真(FEM)可视化操作

一、引言 二、FEM可视化操作流程1.打开可视化界面2.查看介质的网格3.设置网格颜色4.选择网格5.传感器选择6.编辑传感器7.选择频率8.动画 三、总结介绍了在ADS中如何进行FEM仿真场视图操作过程。

XZ_ZC的博客 1815

AAS android-dev 技能深度解析:React Native (TypeScript) 生产级移动应用架构实战

本文基于 Agentic Awesome Skills(AAS)仓库中 android-dev 技能的 React Native 参考文档,系统讲解一套 TypeScript 技术栈下的 React Native 生产级应用架构:feature-first 目录结构、React Navigation v7 类型化导航、Zustand + React Query 双轨状态管理、带安全 Token 注

gitblog_00475的博客 821

深度学习注意力机制新突破:YOLOv8结合SimAM无参数注意力模块,让目标检测更精准!

在计算机视觉领域,注意力机制已成为提升模型性能的关键技术。然而,传统的注意力模块如SENet、CBAM等往往引入大量额外参数,增加了模型的复杂度和计算负担。本文介绍一种创新的无参数注意力机制——SimAM(Simple Parameter-Free Attention Module),并将其成功应用于YOLOv8目标检测框架。SimAM基于神经科学理论,通过定义能量函数为特征图计算3D注意力权重,无需任何额外参数即可显著提升模型性能。本文详细阐述了SimAM的理论基础、实现原理,并提供了完整的YOLOv8集

YOLO 99

UEFI 基础教程 (零) - 目录

UEFI 基础教程 (十八) — UEFI Build Process简单分析。UEFI 基础教程 (十五) — 获取UEFI MemoryMap。UEFI 基础教程 (六)   —  PROTOCOL 简单使用。UEFI 基础教程 (十)   —  FileIO 简单使用。UEFI 基础教程 (一)   —  搭建UEFI开发环境。UEFI 基础教程 (九)   —  EVENT 简单使用。UEFI 基础教程 (七)   —  HOB 简单使用。UEFI 基础教程 (八)   —  PCD 简单使用。..

技术联盟 1537

React Native从0到1开发一款App

*React版本**的开眼App链接(React18+React-Vant+Mobx+axios):https://github.com/WinWang/react-oepn-eye **Vue2版本**WanAndroid项目链接(Vue2+vuex+vant+axios):https://github.com/WinWang/Vue-WanAndroid **Android组件化项目初始化工具**ApplicationInit链接(gradle-plugin+注解APT+ASM)

wcsandlili的博客 1372

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

艾尔登法环存档编辑工具 ER-Save-Editor 上手指南:导入存档、加武器、改属性 5 步搞定

ER-Save-Editor 是一款开源的图形界面工具,用来直接编辑《艾尔登法环》存档文件:调属性点、往背包加武器护甲、控制 Boss 和祝福点的剧情进度,PC 和 PlayStation 的存档都兼容,全程点鼠标,不用碰任何二进制内容。 它适合两类人:一周目漏拿了关键道具、不想重开的玩家;以及想快速搭 build、把练了很久的角色复制出来的玩家。下面按你实际会操作的顺序讲。 ## 把存档文件

gitblog_02756的博客 431

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

React Native开源鸿蒙跨平台工程 DAY3:网络请求集成和美食博客页面开发

本次 DAY3 任务基于React Native + 开源鸿蒙技术栈,完成了网络请求集成与美食博客核心页面开发:技术上:通过 axios 实现了规范的网络请求流程,完成鸿蒙网络权限配置,解决了跨平台网络访问、组件适配等问题;功能上:实现了首页轮播、分类筛选、食谱详情、异常兜底等核心功能,页面交互流畅、布局适配鸿蒙设备;验证上:工程在鸿蒙模拟器中正常运行,网络请求、数据渲染、页面跳转均验证通过,满足 DAY3 任务的所有要求。后续可在此基础上对接真实美食接口,替换模拟数据实现动态加载;

x252625的博客 1113

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

React Router导航函数封装指南:从路径管理到类型安全与路由守卫

在React前端项目中,路由导航是不可或缺的基础能力。随着应用规模扩大,散落在组件中的硬编码路径和导航调用会成为维护噩梦,这通常源于对useNavigate等导航API的过度直接使用。路由管理的关键在于将路径视为唯一事实来源,通过路径集中管理、类型安全的参数推导以及导航逻辑的复用,降低改动成本和出错概率。工程实践中,导航函数封装的价值不仅体现在页面跳转,更体现在组件外导航(如HTTP拦截器触发登录跳转)、登录后回跳以及路由守卫联动的统一处理上。通过合理封装,开发者可以在编译期规避参数类型错误,在运行期避免时

weixin_34315485的博客 256

基于HarmonyOS API 24 React Native跨平台鸿蒙开发实战系列:项目引入axios,实现接口API请求

在React Native中开发Harmony组件(Harmony组件这里指的是一个特定的组件,可能是指某个特定的功能或UI组件,例如一个记录管理组件),你可以遵循以下步骤。我将以一个简单的“最近查看记录管理”组件为例,展示如何实现它。步骤 1: 创建新的React Native项目步骤 2: 创建组件在src或components目录下创建一个新的React组件。例如,我们可以创建一个名为步骤 3: 使用组件在需要显示最近查看记录的页面中使用这个组件。例如,在App.js步骤 4: 运行你的应用。

wanmeijuhao的博客 199

agentic-awesome-skills React Native App 模板实战:基于 Expo + TypeScript 的移动应用脚手架完整指南

本文以 agentic-awesome-skills 仓库中 app-builder 技能族的 `react-native-app` 项目模板为核心,系统讲解一套以 Expo + TypeScript + Expo Router + Zustand + React Query + NativeWind 为标准组合的移动端应用脚手架规范。你将掌握该模板的目录结构、导航模式、状态管理分工、关键依赖选型

gitblog_07201的博客 533

基于HarmonyOS API 24 React Native跨平台鸿蒙开发实战系列:项目引入axios增加Header参数

在React Native中开发鸿组件(这里指的是鸿蒙(HarmonyOS)组件),你需要了解鸿蒙开发的基础以及如何在React Native项目中集成鸿蒙应用。鸿蒙OS是由华为开发的一个分布式操作系统,主要用于其智能设备,如手机、平板、智能手表等。首先,你需要熟悉鸿蒙OS的开发环境设置和基本开发流程。React Native本身主要用于Harmony和Harmony平台的开发,但你可以通过以下几种方式将鸿蒙应用集成到React Native项目中:A. 使用WebView。

wanmeijuhao的博客 244

毫秒级托管AI Agent?用smolBSD构建AI智能体微型虚拟机

想给 AI Agent 一个秒级启动、强隔离的运行环境吗?smolBSD 是一款基于 NetBSD 的微型虚拟机构建工具,它能在约 10 毫秒内启动一台微型 VM(microVM),并把 picoclaw、crush 等 AI 智能体直接装进隔离的虚拟系统中。本文带你快速上手 smolBSD,完成从镜像构建到 AI Agent 运行的完整流程。 ## 什么是 smolBSD?为什么适合跑 AI

gitblog_00441的博客 575

Traefik Web UI 前端开发与构建指南:基于 React + Vite 的 Proxy Dashboard 从源码到产物全流程解析

本文以 Traefik 仓库中 [webui/readme.md](https://link.gitcode.com/i/5acb09acb45320f933135a5ea5c451d8) 为核心,完整梳理 Traefik Web UI(Dashboard)的功能定位、前后端构建链路、本地开发与测试流程,并深入到 [pkg/api/dashboard/dashboard.go](https://l

gitblog_00330的博客 875

React Native依赖管理全攻略:选型、版本锁定与原生兼容实践

在移动端工程化实践中,依赖管理是决定项目长期可维护性的关键环节。React Native项目不同于纯前端应用,每个依赖包可能同时携带Android Gradle模块与iOS Podspec,使得依赖解析横跨npm、Gradle、CocoaPods三套体系。理解autolinking机制和原生代码编译链路,是解决版本冲突、构建失败等问题的基础。通过科学的选型原则、严格的版本锁定策略以及系统的排查流程,开发者可以有效控制依赖膨胀,降低升级风险。本文从实际工程场景出发,梳理React Native依赖管理的完整方

weixin_29009971的博客 239
上一篇: SpringBoot起服务报错
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值