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

news/2024/5/6 14:39:20/文章来源:https://blog.csdn.net/weixin_53312997/article/details/129307532

引言

用过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.luyixian.cn/news_show_76462.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux: ARM GIC只中断CPU 0问题分析

文章目录1. 前言2. 分析背景3. 问题4. 分析4.1 ARM GIC 中断芯片简介4.1.1 中断类型和分布4.1.2 拓扑结构4.2 问题根因4.2.1 设置GIC SPI 中断CPU亲和性4.2.2 GIC初始化&#xff1a;缺省的CPU亲和性4.2.2.1 boot CPU亲和性初始化流程4.2.2.1 其它非 boot CPU亲和性初始化流程5.…

JS模块化规范

JS模块化 什么是模块&#xff1f; 将一个复杂的程序依据一定的规则(规范)封装成几个模块(文件), 并进行组合在一起块的内部数据/实现是私有的, 只是向外部暴露一些接口(方法)与外部其它模块通信 模块的组成 数据——>内部属性操作数据的行为——>内部函数 我们&#x…

亚马逊二审来袭,跨境电商传统验证算法真的靠谱吗?

多个大卖突遭二审 已有卖家账号被封 近期有不少卖家在论坛上反映称自己收到了亚马逊的二次视频验证邮件。 邮件上称&#xff1a; 卖家必须要完成额外的身份审查&#xff0c;才有资格在亚马逊继续销售商品&#xff1b;亚马逊要求卖家出示注册时提交的身份证原件和营业执照原件…

mac系统上hdfs java api的简单使用

文章目录1、背景2、环境准备3、环境搭建3.1 引入jar包3.2 引入log4j.properties配置文件3.3 初始化Hadoop Api4、java api操作4.1 创建目录4.2 上传文件4.3 列出目录下有哪些文件4.4 下载文件4.5 删除文件4.6 检测文件是否存在5、完整代码1、背景 在上一节中&#xff0c;我们简…

PaddleOCR遇到 lanms-neo问题处理

在window环境中安装PaddleOCR依赖是真的蛋疼&#xff0c;关键官方论坛里也都没有具体的解决方案。吐槽。。。吐槽。。。 我在 “windows安装lanms-neo问题处理”文章中看到lanms-neo问题全过程解决。个人觉得文档说明不是很细致&#xff0c;导致我按步骤执行&#xff0c;还是安…

JVM对象实例化详解

1、对象创建方式你知道几种呢&#xff1f;new&#xff1a;最常见的方式、Xxx的静态方法&#xff0c;XxxBuilder/XxxFactory的静态方法Class的newInstance方法&#xff1a;反射的方式&#xff0c;只能调用空参的构造器&#xff0c;权限必须是publicConstructor的newInstance(XXX…

【女士,房间墙上凿个洞,看你在干嘛~】安全攻防内网渗透-绕过防火墙和安全检测,搭建DNS隐蔽隧道

作者&#xff1a;Eason_LYC 悲观者预言失败&#xff0c;十言九中。 乐观者创造奇迹&#xff0c;一次即可。 一个人的价值&#xff0c;在于他所拥有的。所以可以不学无术&#xff0c;但不能一无所有&#xff01; 技术领域&#xff1a;WEB安全、网络攻防 关注WEB安全、网络攻防。…

将vue-devtools打包成edge插件

文章目录一、从github拉vue-devtools源码二、用npm安装yarn三、使用yarn安装并编译源码四、将vue-devtools打包成edge插件五、离线安装edge插件一、从github拉vue-devtools源码 目前最新的版本是v6.5.0&#xff0c;地址&#xff1a;https://github.com/vuejs/devtools 二、用n…

深度学习被你忽略的细节系列篇——Softmax、LogSumExp和Sigmoid

平时我们基本用pytorch或者tensorflow框架时&#xff0c;基本对特别底层的函数实现关注不多&#xff0c;仅限于知道公式的原理。但是很多大佬往往自己会实现一些源码(比如ListNet复现)&#xff0c;在看这些源码时&#xff0c;经常出现各种有点难以理解的代码&#xff0c;本来很…

教你如何搭建设备-巡检管理系统,demo可分享

1、简介1.1、案例简介本文将介绍&#xff0c;如何搭建设备-巡检管理。1.2、应用场景设备管理员进行制定设备巡检时间/内容计划、记录设备巡检信息、可以查看今日待巡检设备。2、设置方法2.1、表单搭建1&#xff09;新建表单【设备档案-履历表】&#xff0c;字段设置如下&#x…

安卓手机当旁路网关

一、安卓shell调试工具下载【电脑版下载地址】安卓adb调试工具&#xff0c;包含MAC苹果、Windows和Linux 三种版【手机版下载地址Termux】下载地址&#xff1a;https://github.com/termux/termux-app/releases如果不懂下载哪个版本&#xff0c;可以直接下载通用版&#xff1a;t…

【unity3d】rts engine 5 设置集结点;放置建筑

一 接上回新建建筑&#xff0c;设置生产单位&#xff0c;现在设置集结点 1 进入建筑预制体&#xff0c;add component 添加 rallypoint setting target 页面&#xff0c;设置面板按钮&#xff0c;音频 resource dead是可设置在耗尽的资源上&#xff0c;下一个是自动寻找附近同…

QT打包的两种方式

QT打包的两种方式&#xff1a; 一个是QT5自带的windeployqt&#xff08;不需要下载安装&#xff09;&#xff0c;它可以找到程序&#xff08;exe&#xff09;用到的所有库文件&#xff0c;并且都拷贝到exe程序的当前文件。此时打包的exe较小&#xff0c;需要和拷贝进来的文件放…

Modbus网关在锂电池干燥箱的应用

在锂离子电池生产过程中&#xff0c;将正负极片辊压绕卷再放入电池盒之后&#xff0c;须对锂电池电芯极组进行烘烤干燥。相信大家也了解水分对锂电池的性能影响是很大的&#xff0c;需要注液前在装配车间将锂离子电池电芯内部的水分去除&#xff0c;以免影响锂电池质量。在锂电…

在 The Sandbox 中以全新的 Rabbids 体验庆祝兔年!

育碧(Ubisoft) 和 The Sandbox 联手为你们带来终极的农历新年体验&#xff01; 穿戴上你们新鲜出炉的 Rabbids 人物化身来参加派对吧&#xff0c;保证震撼整个元宇宙&#xff01;这个全新体验为 Rabbids 人物化身持有者专属。没有获得 Rabbids 人物化身吗&#xff1f;不要担心&…

你知道Java中的JCP, JEP, JLS, JSR是什么意思吗?

目录 一、JCP 二、JSR 三、JLS 四、JEP 公众号&#xff1a;MCNU云原生&#xff0c;欢迎微信搜索关注&#xff0c;更多干货&#xff0c;及时掌握。 JCP, JEP, JLS, JSR这些概念是Java社区中的一些概念&#xff0c;但是没有没有经常关注社区的童鞋们未必知道这些缩写所代表的…

围棋

围棋 规则 棋盘 围棋使用矩形格状棋盘及黑白二色圆形棋子进行对弈&#xff0c;正规棋盘上有纵横各19条线段&#xff0c;361个交叉点。 基本下法 1&#xff0e;对局双方各执一色棋子&#xff0c;黑先白后&#xff0c;交替下子&#xff0c;每次只能下一子。 2&#xff0e;棋子…

Go 实现 AOI 区域视野管理

在游戏中,场景里存在大量的物体.如果我们把所有物体的变化都广播给玩家.那客户端很难承受这么大的压力.因此我们肯定会做优化.把不必要的信息过滤掉.如只关心玩家视野所看到的.减轻客户端的压力,给玩家更流畅的体验. 优化的思路一般是: 第一个是尽量降低向客户端同步对象的数量…

为什么FPGA在深度学习领域有着得天独厚的优势?

01 FPGA在深度学习领域有哪些优势 FPGA&#xff08;Field-Programmable Gate Array&#xff09;是一种灵活的可编程硬件设备&#xff0c;它在深度学习应用领域中具有许多优势。 首先&#xff0c;FPGA具有非常高的并行性。在深度学习中&#xff0c;许多计算都可以并行化&…

“数字档案室测评”相关参考依据梳理

数字档案室建设无疑比数字档案馆建设应用范围更为广泛&#xff0c;涉及的单位类型和专业领域也更多。这一点从国家档案局的机构设置上也可以看出端倪&#xff1a; 国家档案局两个内设业务指导司中&#xff0c;档案馆(室)业务指导司主要针对档案馆和机关档案室&#xff0c;而经济…