方法

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. RatingBar android 自定义 评级 星星

    资源下载地址 <!-- xml 中的使用 --> <RatingBar android:id="@+id/ratingBar" android:layout_wi ...

  2. 11g编译bbed

    报错如下: make -f ins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed Linking BBED utility (bbed) rm -f /u01/app/or ...

  3. CF433B

    题目简化和分析: 为了更加快速的求出答案,好像没前缀和快速. 为了大家更好的理解线段树,我们使用了线段树. 如果您并不了解线段树,可以转战模板. 因为我们知道线段树可以快速求区间和,于是我们建两棵树. ...

  4. Newstar CTF 2023

    WEEK1 PWN 1.ezshellcode 直接sendline(shellcode)即可 exp: from pwn import * p = remote("node4.buuoj. ...

  5. ELK+ filebeat

    ELK 企业级日志分析系统 ELK 概述 1.ELK 简介 ELK平台是一套完整的日志集中处理解决方案,将 ElasticSearch.Logstash 和 Kiabana 三个开源工具配合使用, 完 ...

  6. CC BY-SA 4.0原文及翻译

    CC BY-SA 4.0原文及翻译 英文参考链接 中文参考链接 原文: Attribution 4.0 International (CC BY 4.0) This is a human-readab ...

  7. PTA乙级1044C++(手动打表hhh)

    1044 火星数字 (20 分) 火星人是以 13 进制计数的: 地球人的 0 被火星人称为 tret. 地球人数字 1 到 12 的火星文分别为:jan, feb, mar, apr, may, j ...

  8. 最新 2023.2 版本 WebStorm 永久破解教程,WebStorm 破解补丁永久激活(亲测有效)

    最近 jetbrains 官方发布了 2023.2 版本的 IDEA,之前的激活方法并不支持这个新的版本. 下面是最新的激活教程,激活步骤和之前是类似的,只是换用了不同的补丁文件. 本教程支持 Jet ...

  9. Dapper.Lite 扩展

    最近重构并精简了Dapper.Lite,然后把不依赖Dapper的版本LiteSql也重构了一下,和Dapper.Lite保持一致.感觉这两款ORM基本完工,自荐一下. .NET的ORM虽多,堪用的不 ...

  10. Spring5学习随笔-Spring5的基本介绍、工厂设计模式

    学习视频:[孙哥说Spring5:从设计模式到基本应用到应用级底层分析,一次深入浅出的Spring全探索.学不会Spring?只因你未遇见孙哥] Spring系列-工厂 第一章.引言 Spring I ...