自己动手打造一款React路由守卫

news2024/11/25 10:28:01

引言

用过vue的小伙伴都知道,vue自带路由守卫钩子并且巨他妈的好用,而对于react开发者来说,在需要路由权限校验时常常存在许多痛点问题。今天我将为大家打造一款属于我们reacter的路由守卫方法,希望可以为大家提供帮助。

react路由

大家先不要急,我们先温习下react基本的路由搭建过程。由于react路由统一管理不唯一,此处列举的是基于useRoutes的路由管理。

1. 下载安装

npm install react-router-dom@6 

2. index.js挂载

import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
import { BrowserRouter,HashRouter } from "react-router-dom";
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<BrowserRouter><App /></BrowserRouter>

); 

3.定义路由数组

/router/index.js

import Page1 from "./../views/Page1";
import Page2 from "./../views/Page2";
import Login from "./../views/Login";
import NotFound from "./../views/404";
export default [{path:'/',element:<Page1/>,auth:false},{path:'/page2',element:<Page2/>,auth:true},{path:'/login',element:<Login/>},{path:'/404',element:<NotFound/>}

] 

4.App.js通过useRoutes统一管理路由

import {useRoutes} from "react-router-dom"
import router from "./router/index";
function App() {return useRoutes(router);
}
export default App; 

经过上面四步,react简单的路由就搭建成功了,大家就轻松可以完成路由页面的切换。

路由守卫

终于要开车了,大家准备好安全带。经过上面简单的介绍,我们已经知道了如何搭建简单的路由管理,那么如何基于上面的知识点完成路由守卫?嗯不卖关子了,请继续往下看。

1.路由数组保持不变,同上面的 /router/index.js一样

2.创建函数路由组件,模拟路由守卫 /router/beforeEnter.js

import {useLocation,useNavigate,useRoutes} from "react-router-dom";
import {useState,useEffect} from "react";
const BeforeEnter = ({routers}) => {//1.在路由数组中找当前页面路由的对应路由项const fineRouter = (routes,path) => {for(let val of routers) {if(val.path===path) return val;if(val.children) return fineRouter(val.children,path);}return null;}//2.路由守卫判断const judgeRouter = (location,navigate) => {const {pathname} = location;//2.1路由数组找路由项const findRoute = fineRouter(routers,pathname);//2.2没找到,说明没有这个路由,直接404if(!findRoute) {navigate("/404");return ;}//2.3路由项如果有权限需求,进行逻辑验证if(findRoute.auth) {//用户未登陆,挑战登陆页面if(!localStorage.getItem("user")) navigate("/login");}}//3.基于useEffect监听页面路由改变。然后组件重新加载,又重新校验权限。const navigate = useNavigate();const location = useLocation();const router = useRoutes(routers);useEffect(()=>{//路由守卫判断judgeRouter(location,navigate)},[navigate,location])return router;
}
export default BeforeEnter; 

3.App.js

App.js只需要简单的几行代码就完事了。

 import {useRoutes} from "react-router-dom"import BeforeEnter from "./router/beforeEnter";import router from "./router/index";function App() {return <BeforeEnter routers={router}/>}export default App; 

4.效果展示

为了加深效果,我们还是基于上面的路由组件进行讲解。我逐一列举路由各个页面的功能。在路由数组中我们约定,如果路由项添加了auth:true表示该路由需要进行权限校验。此处我们就是检验是否登陆。

Page1.js

根据路由数组,我们很清楚,这个组件是首页功能不需要权限校验

 export default () => {return <div>首页</div>} 

Page2.js

根据路由数组,我们很清楚,这个组件是需要权限认证

export default () => {return <div>page2</div>
} 

404.js

根据路由数组,这个组件就是当路由没有匹配到时,跳到404页面

export default () => {return <div>404</div>
} 

login.js

根据路由数组,这个组件就是模拟登陆页面,如果某个路由需要校验权限,并且权限失败时,就跳转到登陆页面。 其次我们在登陆页面模拟登陆效果,登陆点击后,自动跳转到首页。

import {useNavigate} from "react-router-dom";

export default () => {const nav = useNavigate();return <div>login页面<div onClick={()=>{localStorage.setItem("user","dzp");setTimeout(() => {nav('/');}, 1000);}}>点击登陆</div></div>

} 

完整效果展示

1. 初始没有登陆,我们直接来到首页,正常
2. 我们访问page1,正常
3. 我们随意访问page99.自动跳转404页面
4. 我们访问page2,page2需要权限认证。由于未登陆,自动跳转登陆页面,然后我们点击登陆挑战到首页,接着我们继续访问page2,发现访问成功。 

最后

整理了一套《前端大厂面试宝典》,包含了HTML、CSS、JavaScript、HTTP、TCP协议、浏览器、VUE、React、数据结构和算法,一共201道面试题,并对每个问题作出了回答和解析。

有需要的小伙伴,可以点击文末卡片领取这份文档,无偿分享

部分文档展示:



文章篇幅有限,后面的内容就不一一展示了

有需要的小伙伴,可以点下方卡片免费领取

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/383666.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JVM

HotSpot虚拟机结构概览 JVM是运行在操作系统之上的&#xff0c;并没有和硬件有直接的交互&#xff1b;正所谓Java代码一次编译,到处运行 方法区和堆区是所有线程共享的内存区域&#xff1b; 而java栈、本地方法栈和程序计数器是运行是线程私有的内存区域。Java栈又叫做jvm虚拟…

c语言指针怎么理解 第二部分

第四&#xff0c;指针有啥用。 比方说&#xff0c;我们有个函数&#xff0c;如下&#xff1a; int add&#xff08;int x){ return (x1); //把输入的值加1并返回结果。 } 好了&#xff0c;应用的时候是这样的&#xff1a; { int a1; aadd(a); //add函数返回的是a1 //现在 a等于…

在苹果电脑 mac 上安装原神(playCover)

该方法只能在 M1、M2 mac 上安装原神 目录前言一、首先下载安装 playCover1. playCover 下载2. playCover 安装安装出现问题解决方法二、下载安装原神1.安装包下载2.安装原神三、登录、键盘映射及版本更新等问题登录键盘映射版本更新前言 最近买了新的mac&#xff0c;作者本人…

Python自动化测试之request库【参数关联】(五)

目录&#xff1a;导读 参数关联 1、找到一个接口发送请求 2、分析返回&#xff0c;提取下一个接口需要用到请求 3、请求下一个接口&#xff0c;上一个接口的返回当作请求参数 正则表达式提取数据 1、请求接口&#xff0c;查看返回内容 2、通过正则表达式取数据 3、上一…

借助阿里云 AHPA,苏打智能轻松实现降本增效

作者&#xff1a;元毅 “高猛科技已在几个主要服务 ACK 集群上启用了 AHPA。相比于 HPA 的方案&#xff0c;AHPA 的主动预测模式额外降低了 12% 的资源成本。同时 AHPA 能够提前资源预热、自动容量规划&#xff0c;能够很好的应对突发流量。” ——赵劲松 (高猛科技高级后台工…

【C#篇】关于Thread.Sleep(1),实际耗时15.6212ms的问题

问题描述&#xff1a;睡眠线程耗时测试&#xff1a;DateTime startTime DateTime.Now;Thread.Sleep(1);DateTime endTime DateTime.Now;TimeSpan tp endTime - startTime;txtMsg.AppendText("睡眠线程耗时测试&#xff1a;" &#xff08;tp.TotalMilliSeconds-1&a…

Android jetpack Compose使用及性能优化小结

大概在两年前在星河集团的左邻右家项目中&#xff0c;我就接触到了jetpack Compose&#xff0c;并且还项目中在逻辑简单的页面&#xff0c;使用了compose去实现。当时觉得很新颖&#xff0c;实践中也感觉到&#xff0c;这种响应式的&#xff0c;与当时的Vue/微信小程序/Flutter…

JDK动态代理详解

1.什么是动态代理 可能很多小伙伴首次接触动态代理这个名词的时候&#xff0c;或者是在面试过程中被问到动态代理的时候&#xff0c;不能很好的描述出来&#xff0c;动态代理到底是个什么高大上的技术。不方&#xff0c;其实动态代理的使用非常广泛&#xff0c;例如我们平常使用…

考研复试——计算机网络

文章目录计算机网络1. 说下计算机网络体系结构2. 说一下每层协议有哪些&#xff1f;3. 数据在各层之间是如何传输的呢&#xff1f;4. [从浏览器地址栏输入 url 到显示主页的过程&#xff1f;](https://blog.csdn.net/weixin_46351593/article/details/115386029)5. 说说 HTTP 常…

Guitar Pro8中文版打谱编曲软件

许多打谱编曲软件中都有吉他乐器的插件&#xff0c;插入音轨即可使用&#xff0c;除此以外&#xff0c;还有一款专门针对吉他的音乐软件&#xff0c;就是Guitar Pro。Guitar Pro是吉他类音乐软件中比较有代表性的&#xff0c;从开发至今不断更新优化&#xff0c;目前的软件版本…

如何远程访问公司的电脑?

是否可以从其他地方远程访问公司的电脑&#xff1f;答案是肯定的。一个可靠的远程桌面工具可以让您从另一台设备远程访问您的工作电脑&#xff0c;无论位置如何&#xff0c;无论您是在咖啡厅、酒店还是家中&#xff0c;您都可以从另一台电脑或移动设备远程访问您工作的电脑以处…

【算法基础】深度优先搜索(DFS) 广度优先搜索(BFS)

一、DFS & BFS 1. 深度优先搜索DFS 深度优先搜索属于图算法的一种,英文缩写为DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。 2. 广度优先搜索BFS 广度优先搜索较之深度优先搜索之不同在于,深度…

TCP内部的十大核心机制

文章目录1、确认应答机制2、超时重传机制3、连接管理机制1、三次握手2、四次挥手4、滑动窗口机制5、流量控制机制6、拥塞控制7、延时应答机制8、捎带应答机制9、面向字节流10、特殊情况1、确认应答机制 TCP是可靠传输&#xff0c;那么TCP协议能够实现可靠传输的核心机制就是确…

Anker推出Security SmartTrack卡,详谈苹果Find My技术

Anker 旗下品牌 Eufy 近日在欧洲、美国市场推出了 Security SmartTrack 卡。其工作原理和苹果 AirTag 类似&#xff0c;允许用户通过手机定位追踪到绑定的物品。 Security SmartTrack卡通过蓝牙连接&#xff0c;范围为 260 英尺&#xff08;约 80 米&#xff09;。采用防水设…

跨境数据传输是日常业务中经常且至关重要的组成部分

跨境数据传输是日常业务中经常且至关重要的组成部分。在过去的20年中&#xff0c;由于全球通信网络和业务流程的发展&#xff0c;全球数据流的模式已迅速发展。随着数据从数据中心移到数据中心和/或跨边界移动&#xff0c;安全漏洞已成为切实的风险。有可能违反国家和国际数据传…

INOBITEC PRO DICOM VIEWER 2.9.0 Crack

inobitec dicom高级 3D 重建&#xff0c;以 OBJ、STL、PLY 格式导出表面&#xff0c;先进的多计划重建&#xff0c;添加标记和标记线&#xff0c;将系列与高级工具相结合&#xff0c;具有多种选择的虚拟内窥镜检查&#xff0c;从视口录制视频&#xff08;仅限 64 位版本&#x…

CSS的6个新特性

1、容器查询&#xff08;Container Queries&#xff09; 容器查询container类似于媒体查询media&#xff0c;区别在于查询所依据的对象不同。媒体查询依据的是浏览器的视窗大小&#xff0c;容器查询依据的是元素的父元素或者祖先元素的大小。 有关容器查询的属性一共有三个&a…

vue2的动画和过渡效果

文章目录过渡 & 动画Transition 组件基于 CSS 的过渡效果CSS 过渡类名 class为过渡效果命名CSS 过渡 transition实例1&#xff1a;实例2&#xff1a;CSS 动画自定义过渡的类名同时使用 transition 和 animation深层级过渡与显式过渡时长性能考量JavaScript 动画可复用过渡效…

STM32 HAL库硬I2C的TOF050C模块

前言最近在倒腾毕业设计&#xff0c;需要用到TOF050C&#xff0c;但是现有的案例都是软IIC&#xff0c;并且还是基于STM32F103的&#xff0c;笔者用的STM32F767&#xff0c;没有GPIO->CRH寄存器。问题来了&#xff0c;如果我每次都要去看寄存器手册属实费时间&#xff0c;这…

案例08-让软件的使用者成为软件的设计者

一&#xff1a;背景介绍 对于需求的开发每天可能都会有上线的情况&#xff0c;为了防止每次上线拉取代码或者修改配置而引发的冲突以及发生了冲突应该找谁一起确定一下代码留下那一部分的情况。所以在开发的群中会有一个表格来记录每个需求上线修改的环境、是否修改数据库、是否…