方法

1.模拟vue的路由拦截(未尝试)

2.进入页面拦截(模拟后台管理系统)

route v6常用属性

页面梳理

  • 路由表
  • 公共路由
  • 权限路由
  • layout(+权限判定)
  • 登录

页面布局

路由表

点击查看代码

//menus.js
const menus = [
{
key: "0-0",
path: "/list",
title: "系统首页",
icon: <AreaChartOutlined />,
component: React.lazy(() => import("../pages/List.jsx")),
},
{
key: "0-1",
path: "/edit",
title: "修改",
icon: <AreaChartOutlined />,
children: [
{
key: "0-1-0",
path: "/edit/car",
title: "文章修改",
icon: <AreaChartOutlined />,
children: [
{
key: "0-1-0-0",
path: "",
title: "列表",
hidden:true,
icon: <AreaChartOutlined />,
component: React.lazy(() => import("../pages/Edit.jsx")),
},
{
key: "0-1-0-1",
path: "/edit/car/add",
title: "新增",
hidden:true,
icon: <AreaChartOutlined />,
component: React.lazy(() => import("../pages/Edit.jsx")),
},
]
},
{
key: "0-1-1",
path: "/edit/ship",
title: "文章发布",
icon: <AreaChartOutlined />,
component: React.lazy(() => import("../pages/Means.jsx")),
}
]
},
{
key: "0-2",
path: "/means",
title: "资料",
icon: <AreaChartOutlined />,
component: React.lazy(() => import("../pages/Means.jsx")),
children: [
{
key: "0-2-0",
path: "/means/ship",
title: "资料查看",
icon: <AreaChartOutlined />,
component: React.lazy(() => import("../pages/Repbox.jsx")),
}
]
},
] export default menus;

公共路由

layout与权限判定放在App页面

注意:v6嵌套路由匹配严格,加上/*全匹配

//main.js 放入公共路由组件
import { BrowserRouter as Router, Routes, Route} from "react-router-dom";
<Router>
<Routes>
<Route path="/*" element={<App />}></Route>
<Route path="/login" element={<Login />}></Route>
<Route path="/register" element={<Register />}></Route>
</Routes>
</Router>

权限路由

加载时只匹配页面加载且懒加载,故单独写一个jsx,使用Suspense+Lazy

//component加载方式:element={<item.component />}
const renderRoute = (menus) => {
return menus.map((item) => {
if (item.children) {
return (
<Route path={item.path} key={item.key}>
{renderRoute(item.children)}
</Route>
);
} else {
return (
<Route
path={item.path}
key={item.key}
element={<item.component />}
></Route>
);
}
});
};

重定向/

const renderRedirect = (menus) => {
return <Route path="/" element={<Navigate to={menus[0].path} />}></Route>;
};

权限通过props获取,

export default function AppMain(props) {
const {menus}=props
return (
<Suspense fallback={<h2>loading...</h2>}>
<Routes>
{renderRoute(menus)}
{renderRedirect(menus)}
<Route path="*" element={<NotFound />} />
</Routes>
</Suspense>
);
}

layout(+权限判定)< app >

//过滤路由meun:在登录获取的菜单权限
const Validation = (menus, meun) => {
return menus.filter((item) => {
if (item.children) {
item.children = Validation(item.children, meun);
}
return meun.includes(item["key"]);
});
};

token监听

const [state, setState] = useState(false);//判断进入与否页面
const [fmenus, setFmenus] = useState([]);//菜单
const navigate = useNavigate();
useEffect(() => {
getPassword().then((res) => {
//判断token
if (判断通过) {
//登录时保存在localStorage的菜单权限或者后端查询角色权限
//meun为一个数组数据
const meun = localStorage.getItem("meun");
if (meun.includes("all")) {//all拥有所有权限,基础版逻辑
setFmenus(menus);
} else {
let meunsList=deepCopy(menus)//深拷贝
setFmenus(Validation(meunsList, meun));
}
setState(true);
} else {
navigate('/login')
setState(false);
}
});
}, [localStorage.getItem("token")]);

过滤好的菜单传递给AppMain:权限路由;Asider:侧边栏

return (
<>
{state ? (
<Layout id="app">
<Header />
<Layout>
<Asider menus={fmenus} />
<Content>
<BreadCrumbs></BreadCrumbs>
<AppMain menus={fmenus}></AppMain>
{/* <Outlet></Outlet> */}
</Content>
</Layout>
<footer>Respect | Copyright &copy;2022 Author 曜炘</footer>
</Layout>
) : null}
</>
);

登录与退出登录

//登录时存储数据
localStorage.setItem("username", username);
localStorage.setItem("token", token);
localStorage.setItem("meun", meun);
//退出登录时清空数据
localStorage.clear();
sessionStorage.clear();

react路由权限v6的更多相关文章

  1. React+DvaJS 之 hook 路由权限控制

    博客 学院 下载 GitChat TinyMind 论坛 APP 问答 商城 VIP 活动 招聘 ITeye 写博客 发Chat 登录注册 原 React+DvaJS 之 hook 路由权限控制 20 ...

  2. react的路由权限控制

    在使用路由的时候,有的时候我们的界面只能够在登录之后才可以看的到,这个时候就需要使用路由权限控制了 找了资料发现一个就是我使用的方法,一个是高阶组件. 原谅菜鸟看不太懂不会使用高阶组件………… 首先在 ...

  3. react router @4 和 vue路由 详解(七)react路由守卫

    完整版:https://www.cnblogs.com/yangyangxxb/p/10066650.html 12.react路由守卫? a.在之前的版本中,React Router 也提供了类似的 ...

  4. react16 路由按需加载、路由权限配置

    1. 路由按需加载: 不做按需加载,代码全部打包在bundle.js 文件里,首屏渲染很慢,项目文件较多,会出现1分钟加载的可能性. import React, { Component } from ...

  5. react路由的安装及格式和使用方法

    react路由的安装: 在要创建项目的目录命令窗里输入: cnpm install -g create-react-app create-react-app  项目名 在创建好的项目目录命令窗里输入: ...

  6. react路由嵌套

    所谓的嵌套路由就是在某些以及路由下面存在二级路由,这些二级路由除了公用一级路由导航模块外,还公用当前的二级路由的导航模块,也就是部分进行了切换,要实现嵌套路由,首先回顾之前的内容,实现基本的react ...

  7. 【vue】vue的路由权限管理

    前言: 最近闲来无事浏览各种博客,看到了一个关于路由权限的管理,觉得很有用,针对那个博客,准备自己写一个demo. 实现: 路由大致分为用户路由<特定用户才能浏览>和基本路由<所有用 ...

  8. react路由配置(未完)

    React路由 React推了两个版本 一个是react-router 一个是react-router-dom 个人建议使用第二个 因为他多了一个Link组件 Npm install react-ro ...

  9. React路由-基础篇

    React-Router-DOM ReactRouter网址, 安装 -npmjs找到react-router-dom -yarn add react-router-dom 基本使用方法 1.创建一个 ...

  10. react 路由 react-router@3.2.1

    react路由,4.x的差异还是比较大,暂时还是3.x的版本 安装: npm install -S react-router@3.x 配置: import { Router, Route, hashH ...

随机推荐

  1. .NET静态代码织入——肉夹馍(Rougamo)发布2.0

    肉夹馍(https://github.com/inversionhourglass/Rougamo)通过静态代码织入方式实现AOP的组件,其主要特点是在编译时完成AOP代码织入,相比动态代理可以减少应 ...

  2. vue项目打包,解决静态资源无法加载和路由加载无效(404)问题

    打包后的项目静态资源无法使用,导致页面空白 静态资源无法使用,那就说明项目打包后,图片和其他静态资源文件相对路径不对,此时找到config里面的index.js,在build模块下加入assetsPu ...

  3. virsh domxxx命令

    1. 摘要信息类 1.1 dominfo 获取配置等摘要信息 [root@hyperhost ~]# virsh dominfo --domain centos7.6 Id: 1 Name: cent ...

  4. LGPL协议原文及中文翻译

    LGPL协议原文及中文翻译 参考链接 原文: GNU LESSER GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 ...

  5. GPTs破冰硅基文明社会

    GPTs破冰硅基文明社会 渐进是技术革命的常态 技术革命看似一夕之间就颠覆了世界,但实际上每项重大技术进步的背后,都经历了漫长的渐进积累.以蒸汽机为例,最初动力微弱.效率低下,需要大量工程师跟车维护, ...

  6. 一种全新的日志异常检测评估框架:LightAD

    本文分享自华为云社区<[AIOps]一种全新的日志异常检测评估框架:LightAD,相关成果已被软工顶会ICSE 2024录用>,作者: DevAI. 深度学习(DL)虽然在日志异常检测中 ...

  7. 抽象工厂(Abstract Factory)

    模式定义 提供一个接口, 让该接口负责创建一系列'相关或者相互依赖的对象' , 无需指定他们具体的类 要点总结 如果没有应对'多系列对象构建'的需求变化 ,则没有必要使用Abstract Factor ...

  8. 1. Linux 软件介绍

    重点: rpm -i -e -qi -ql -qf -qa --scripts. yum install remove info list repolist provides. 配置系统源. 搭建私有 ...

  9. springMVC特点与优势

    1 SpringMVC和Struts2的优略分析 (面试) 共同点: 它们都是表现层框架,都是基于MVC模型编写的. 它们的底层都离不开原始ServletAPI(HttpServletRequest. ...

  10. [ABC318G] Typical Path Problem

    Problem Statement You are given a simple connected undirected graph $G$ with $N$ vertices and $M$ ed ...