方法

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. docker入门加实战—部署Java和前端项目

    docker入门加实战-部署Java和前端项目 部署之前,先删除nginx,和自己创建的dd两个容器: docker rm -f nginx dd 部署Java项目 作为演示,我们的Java项目比较简 ...

  2. 深入探讨I/O模型:Java中的阻塞和非阻塞和其他高级IO应用

    引言 I/O(Input/Output)模型是计算机科学中的一个关键概念,它涉及到如何进行输入和输出操作,而这在计算机应用中是不可或缺的一部分.在不同的应用场景下,选择正确的I/O模型是至关重要的,因 ...

  3. splay + 垃圾回收 知识点与例题的简要讲解

    splay 简要讲解 前置芝士:普通二叉树 splay tree是一个越处理越灵活的数据结构,通过splay(伸展)操作,使整棵树的单次查询时间复杂度接近于O(log n),整棵树的高度也接近于log ...

  4. Jenkins集成maven/gitlab-代码拉取

    Jenkins插件-加速-上传安装-离线安装 1.加速插件(国外的源替换成国内的源-->系统管理-->插件管理-->高级-->升级站点-->修改URL) 清华源链接:ht ...

  5. React学习笔记16-属性props

    1.属性的定义 props 是正常是外部传入的,组件内部也可以通过一些方式来初始化的设置,属性不能被组件自己更 改,但是你可以通过父组件主动重新渲染的方式来传入新的 props. 这就是React中的 ...

  6. 将ECharts图表插入到Word文档中

    @ 目录 在后端调用JS代码 准备ECharts库 生成Word文档 项目地址 库封装 本文示例 EChartsGen_DocTemplateTool_Sample 如何通过ECharts在后台生成图 ...

  7. 双指针:盛最多水的容器(4.18leetcode每日一题)

    给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0).找出其中的两条线, ...

  8. Jayway JsonPath-提取JSON文档内容的Java DSL

    介绍 JsonPath是一种能够提取部分JSON文档属性.对象.数组的语法,支持条件过滤.数学运算.字符串处理等功能.JsonPath与JSON文档就像 XPath 表达式与 XML 文档结合使用一样 ...

  9. 【Servlet】两种配置

    web.xml中Servlet的注解 <servlet> <!-- servlet的内部名称,⾃定义 --> <servlet-name>类名</servle ...

  10. [Python急救站]文件管理工具

    对于一个程序员,有时候文件太多,忘记放哪里了,那有没有一个可以帮你定位到文件的文件管理工具呢,抱着这样的想法,我做了以下这个代码,可以快速定位找到文件所在位置. import os import tk ...