基于React Router6 TS实现路由守卫

news/2024/9/24 0:29:23/

定义路由表

import {BrowserRouter, Route, RouteObject, Routes,} from "react-router-dom";
import {Home, Login, NotFound} from "@/views";
import {RouterGuard} from "@/routers/router_guard.tsx";
import {ReactNode} from "react";
import {Test} from "@/views/test/test.tsx";
import {LOGIN_PATH} from "@/utils/constant";
import {Broken} from "@/views/Broken/broken.tsx";type AuthRouteObject = {needAuth?: boolean
}const router: RouteObject[] & AuthRouteObject[] = [{path: "/",element: <Home></Home>,needAuth: true,children:[{path: "/test",element: <Test/>,}]},{path: LOGIN_PATH,element: <Login></Login>,needAuth:true},{path:"/500",element:<Broken></Broken>},{path: "*",element: <NotFound></NotFound>}
]export const RenderRouters = () => {const traverseRoutes = (router: RouteObject[] & AuthRouteObject[]) => {return router.map((route: RouteObject & AuthRouteObject): ReactNode => {const element =  <RouterGuard needAuth={route?.needAuth} element={route.element}/>if(Array.isArray(route.children) && route.children.length>0){return (<Route path={route.path} element={element} key={route.path}>{traverseRoutes(route.children)}</Route>)}return <Route path={route.path} element={element} key={route.path}/>})}return (<><BrowserRouter><Routes>{traverseRoutes(router)}</Routes></BrowserRouter></>)
}

定义守卫组件

import {PropsWithChildren, ReactNode} from "react";
import {useUserStore} from "@/store/user_store";
import {Navigate, useLocation} from "react-router-dom";
import {LOGIN_PATH} from "@/utils/constant";interface Props extends PropsWithChildren {element: JSX.Element | ReactNodeneedAuth?:boolean
}export const RouterGuard = (props: Props): JSX.Element | React.ReactNode => {const userStore = useUserStore()const pathName = useLocation().pathnameconst token = userStore.tokenif (!props.needAuth){return props.element}if (token && pathName == LOGIN_PATH){return <Navigate to="/" replace></Navigate>}if (!token && pathName !== LOGIN_PATH) {return <Navigate to={LOGIN_PATH} replace></Navigate>}return props.element
}

使用

import './App.css'
import {RenderRouters} from "@/routers/router.tsx";function App() {return (<><RenderRouters></RenderRouters></>)
}export default App

效果展示

请添加图片描述


http://www.ppmy.cn/news/1424788.html

相关文章

ChatGPT与Python-GEE融合,遥感云大数据分析、管理与可视化

掌握Earth Engine的实际应用能力&#xff0c;以Python为基础&#xff0c;结合实例讲解平台搭建、影像数据分析、经典应用案例、本地与云端数据管理&#xff0c;以及云端数据论文出版级可视化等技能。 为提高教学质量&#xff0c;将融入ChatGPT 4、Claude Opus、Gemini、文心一…

什么是MOV视频格式?如何把MP4视频转MOV视频格式?

一&#xff0c;前言 当然可以&#xff0c;MP4视频可以转换为MOV格式。这两种格式都是常见的视频文件格式&#xff0c;它们都可以用于存储和播放视频内容。虽然它们的编码方式和特性有所不同&#xff0c;但使用合适的视频转换工具可以轻松地将MP4视频转换为MOV格式。 二&#…

【MySQL | 第六篇】数据库三大范式

文章目录 6.数据库设计三大范式6.1第一范式6.2第二范式6.3第三范式6.4反范式设计 6.数据库设计三大范式 6.1第一范式 第一范式&#xff08;1NF&#xff09;&#xff1a;确保每列的原子性(强调的是列的原子性&#xff0c;即列不能够再分成其他几列)。实际上&#xff0c;第一范式…

第七章 案例一:分析ARP解析过程

1、实验环境 主机A和主机B连接到交换机&#xff0c;并与一台路由器互连&#xff0c;如图7.17所示&#xff0c;路由器充当网关。 图7.17 实验案例一示意图 2、需求描述 查看 ARP 相关信息,熟悉在PC 和 Cisco 设备上的常用命令,设置主机A和主机B为同一个网段网关设置为路由接…

【FreeRTOS】RTOS任务的同步与互斥:(二)信号量

【FreeRTOS】RTOS任务的同步与互斥&#xff1a;&#xff08;二&#xff09;信号量 信号量概念二值信号量二值信号量概念二值信号量相关API函数二值信号量的案例设计cubeMX配置软件程序设计 计数型信号量计数型信号量概念计数型信号量相关API函数二值信号量的案例设计cubeMX配置…

油烟净化器智能电控系统:如何实现高效净化与智能控制?

我最近分析了餐饮市场的油烟净化器等产品报告&#xff0c;解决了餐饮业厨房油腻的难题&#xff0c;更加方便了在餐饮业和商业场所有需求的小伙伴们。 在现代餐饮环境中&#xff0c;油烟净化器已成为保障空气清新的必备设备。然而&#xff0c;如何实现高效净化与智能控制成为了…

Python零基础从小白打怪升级中~~~~~~~SQLAlchemy的介绍

第四节&#xff1a;SQLAlchemy操作数据库 一、SQLAlchemy介绍 SQLAlchemy 是 Python 中一个通过 ORM 操作数据库的框架。 SQLAlchemy对象关系映射器提供了一种方法&#xff0c;用于将用户定义的Python类与数据库表相关联&#xff0c;并将这些类&#xff08;对象&#xff09;…

基于windowns下的TCP网络通信编程

Tcp通信的三次握手和四次挥手 TCP的三次握手和四次挥手是TCP连接的建立和断开过程&#xff0c;确保了可靠的数据传输和连接状态的正确管理。 TCP的三次握手&#xff08;TCP 链接建立&#xff09;&#xff1a; 1. 客户端发送 SYN &#xff1a; 客户端向服务器发送一个 SYN 报文…