方法

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. 深入理解 Skywalking Agent

    概述 Agent 功能介绍 + 整体结构 + 设计 插件机制详解 Trace Segment Span 详解 异步 Trace 详解 如何正确地编写插件并防止内存泄漏 扩展:如何基于 Skywalki ...

  2. 畅捷通T+任意文件上传(CNVD-2022-60632 )漏洞复现

    一.漏洞描述 022年8月29日和8月30日,畅捷通公司紧急发布安全补丁修复了畅捷通T+软件任意文件上传漏洞.未经身份认证的攻击者利用该漏洞,通过绕过系统鉴权,在特定配置环境下实现任意文件的上传,从而 ...

  3. 13. 从零开始编写一个类nginx工具, HTTP中的压缩gzip,deflate,brotli算法

    wmproxy wmproxy将用Rust实现http/https代理, socks5代理, 反向代理, 静态文件服务器,后续将实现websocket代理, 内外网穿透等, 会将实现过程分享出来, 感 ...

  4. 1.NoSQL-lesson14-MongoDB核心技术-运维篇

    逻辑结构 Mongodb 逻辑结构 MySQL逻辑结构 库database 库 集合(collection) 表 文档(document) 数据行 选择之所以称为为选择,肯定是痛苦的! ------& ...

  5. HarmonyOS 高级特性

    引言 本章将探讨 HarmonyOS 的高级特性,包括分布式能力.安全机制和性能优化.这些特性可以帮助你构建更强大.更安全.更高效的应用. 目录 HarmonyOS 的分布式能力 HarmonyOS ...

  6. Python入门--字符串

    字符串的使用和C语言 .java中一致 .使用" "(双引号)并且字符串可以与数字相乘,表示我使用这个字符串次数 字符串的连接:'+' Python中的变量直接赋值即可 ,如果赋予 ...

  7. Django的staticfiles库

    staticfiles 库是 Django 提供的一个用于管理静态文件的库,它提供了一些工具和函数来帮助开发者在 Django 应用程序中管理和提供静态文件服务. 在 Django 应用程序中,静态文 ...

  8. 【Android】【外包杯】后台管理系统 | 进度day01

    外包杯官方提示:平台不要太大,只是一些小东西包括支付宝和微信小程序打开,无需安装口香糖,餐巾纸有一块屏幕,不需要很大,只需要满足顾客可以看到传播的内容打开橱窗不要有锋利边角,不要求一体,提高场景利用率 ...

  9. MINA框架

    一.小程序MINA框架分为三个部分: 有 View(视图层).App Service(逻辑层)和 Natice(系统层). 1.View(视图层) 视图层包含了小程序多个页面.每个页面都有WXML文件 ...

  10. 重写Nacos服务发现逻辑动态修改远程服务IP地址

    背景 还是先说下做这个的背景,开发环境上了K8S,所有的微服务都注册在K8S内的Nacos,注册地址为K8S内部虚拟IP,K8S内的服务之间相互调用没有问题,但是本机开发联调调用其他微服务就访问不到. ...