react_14

动态路由

路由分成两部分:

  • 静态路由,固定的部分,如主页、404、login 这几个页面

  • 动态路由,变化的部分,经常是主页内的嵌套路由,比如 Student、Teacher 这些

动态路由应该是根据用户登录后,根据角色的不同,从后端服务获取,因为这些数据是变化的,所以用 mobx 来管理

在src\store\路径下新建RoutesStore.tsx

import axios from "axios";
import {LoginReq,LoginResp,Menu,MenuAndRoute,Route,
} from "../model/Student";
import R from "../model/R";
import { makeAutoObservable, runInAction } from "mobx";
import { Link, Navigate, RouteObject } from "react-router-dom";
import { load } from "../router/MyRouter";
import A8Main from "../pages/A8Main";
import A8NotFound from "../pages/A8NotFound";
import { ItemType } from "antd/es/menu/hooks/useItems";
import Icon from "./Icon";
//其中 convertMenu 为核心方法,负责将服务器返回的 Menu 转换成 antd Menu 组件需要的 Menu
function convertMenu(m: Menu): ItemType {const Label = m.routePath ? <Link to={m.routePath}>{m.label}</Link> : m.label;return {key: m.key,label: Label,icon: <Icon name={m.icon}></Icon>,children: m.children && m.children.map(convertMenu),};
}
class RoutesStore {dynamicRoutes: Route[] = [];dynamicMenus: Menu[] = [];token: string = "";message: string = "";state: string = "pending";async login(loginReq: LoginReq) {this.state = "pending";const resp1 = await axios.post<R<LoginResp>>("http://localhost:8080/api/loginJwt",loginReq);if (resp1.data.code === 999) {const resp2 = await axios.get<R<MenuAndRoute>>(`http://localhost:8080/api/menu/${loginReq.username}`);runInAction(() => {this.dynamicRoutes = resp2.data.data.routeList;localStorage.setItem("dynamicRoutes",JSON.stringify(this.dynamicRoutes));this.dynamicMenus = resp2.data.data.menuTree;localStorage.setItem("dynamicMenus", JSON.stringify(this.dynamicMenus));this.token = resp1.data.data.token;localStorage.setItem("token", this.token);this.state = "success";});} else {runInAction(() => {this.state = "error";this.message = resp1.data.message || "未知错误";});}}/*   async fetch(username: string) {const resp = await axios.get<R<MenuAndRoute>>(`http://localhost:8080/api/menu/${username}`);runInAction(() => {this.dynamicRoutes = resp.data.data.routeList;//当在浏览器地址栏重新输入路径的时候,会重新向7070服务器发送一个请求,导致RoutesStore.tsx重新执行,//导致路由对象重新被创建,那么登录之后获得的动态路由数据就会丢失,所以为了防止这种情况,把登录后获得的//路由数据存入到localStorage中localStorage.setItem("dynamicRoutes", JSON.stringify(this.dynamicRoutes));this.dynamicMenus = resp.data.data.menuTree;localStorage.setItem("dynamicMenus", JSON.stringify(this.dynamicMenus));});} */get routes() {const staticRoutes: RouteObject[] = [{path: "/login",element: load("A8Login"),},{path: "/",element: <A8Main></A8Main>,children: [],},{path: "/404",element: <A8NotFound></A8NotFound>,},// 使用这个路径,上面的路径匹配不到时,显示notFound页面,但是路径还是输入的路径不变{ path: "/*", element: <A8NotFound></A8NotFound> },//   使用这种路径写法的时候,上面的路径匹配不到时,页面是重定向到notFound,路径会跳转到404{path: "/*",element: <Navigate to={"/404"}></Navigate>,},];staticRoutes[1].children = this.dynamicRoutes.map((r) => {return { path: r.path, element: load(r.element) };});return staticRoutes;}get menus() {return this.dynamicMenus.map(convertMenu);}get username() {if (this.token.length === 0) {return "";}
//token 的前两部分都可以解码出来,其中 [1] 就是 token 的内容部分const json = atob(this.token.split(".")[1]);//parse方法把字符串还原成对象return JSON.parse(json).sub;}constructor() {makeAutoObservable(this);//页面刷新会重新调用构造器,这个时候从localStorage中获取存储的路由数据const routesJson = localStorage.getItem("dynamicRoutes");this.dynamicRoutes = routesJson ? JSON.parse(routesJson) : [];const menusJson = localStorage.getItem("dynamicMenus");this.dynamicMenus = menusJson ? JSON.parse(menusJson) : [];}reset() {localStorage.removeItem("dynamicRoutes");this.dynamicRoutes = [];localStorage.removeItem("dynamicMenus");this.dynamicMenus = [];localStorage.removeItem("token");this.token = "";this.state = "pending";}
}
export default new RoutesStore();
  • 其中用 localStorage 进行了数据的持久化,避免刷新后丢失数据

  • 跳转若发生错误,可能是因为组件懒加载引起的,需要用 Suspense 解决

  • root.render(<ConfigProvider locale={zhCN}><BrowserRouter><Suspense fallback={<h3>加载中...</h3>}><MyRouter></MyRouter></Suspense></BrowserRouter></ConfigProvider>
    )

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/132608.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LInux-0.11

文章目录 前言学习资料正文 前言 B站视频链接 linux 0.11 内核代码 学习资料 正文 一个山区512字节

二进制搭建 Kubernetes v1.20

这里写目录标题 二进制搭建 Kubernetes v1.20一.环境准备1.网络分配2.操作系统初始化配置 二.部署 etcd 集群1.etcd相关知识2.准备签发证书环境 三.部署 docker引擎四.部署 Master 组件五.部署 Worker Node 组件六.部署 CNI 网络组件1.部署 flannel2.部署 Calico3.部署 CoreDNS…

5G-DFS最新动态-产品不在需要走FCC官方测试

添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 最近&#xff0c;FCC公布了最新版本的PAG&#xff08;Product Acceptance Group&#xff09;清单&#xff0c;即388624 D02 Pre-Approval Guidance List v18r04。这个清单的主要改变是将带有雷达侦测功能的…

第三方美颜SDK是什么?在直播平台中有哪些应用?

第三方美颜SDK已经成为许多应用和平台的核心功能之一&#xff0c;它们为用户提供了一种改善自己在直播和视频分享中外表的方式。本文将探讨第三方美颜SDK是什么&#xff0c;以及它们在直播平台中的各种应用。 一、什么是第三方美颜SDK&#xff1f; 第三方美颜SDK是一组软件工…

AWS组件使用

kafka或kinesis 做数据收集 S3redshift 做数仓 EMR做计算 RDS做数据市场 AWS Glue / AWS Data Pipeline 做数据集成 这些组件配合起来&#xff0c;几乎可以做各种方式的数据分析 kinesis还是比较推荐&#xff0c;延迟时间可以配置的算是实时的&#xff0c;而且功能会多一点&am…

软考 系统架构设计师系列知识点之系统架构评估(5)

接前一篇文章&#xff1a; 所属章节&#xff1a; 第8章. 系统质量属性与架构评估 第2节. 系统架构评估 8.2.1 系统架构评估中的重要概念 相关试题 1. 在架构评估中&#xff0c;&#xff08;&#xff09;是一个或多个构件&#xff08;和/或构件之间的关系&#xff09;的特性。…

AndroidAuto 解决连接手机启动AA屏闪一下问题

AndroidAuto一般在AndroidManifest.xml注册的Activity配置过滤监听特定手机的USB插拔启动AA <activityandroid:name=".sink.ui.MainActivity"android:configChanges="keyboard|keyboardHidden|uiMode"android:windowSoftInputMode="stateHidden&qu…

使用Docker安装mysql,挂载外部配置和数据

1、挂载外部配置和数据安装 #在home目录下创建mysql文件夹&#xff0c;下面创建data和conf.d文件夹mkdir /home/mysqlmkdir /home/mysql/conf.dmkdir /home/mysql/data/创建my.cnf配置文件touch /home/mysql/my.cnf​my.cnf添加如下内容&#xff1a;[mysqld]usermysqlcharacter…

深入理解强化学习——多臂赌博机:非平稳问题

分类目录&#xff1a;《深入理解强化学习》总目录 到目前为止我们讨论的取平均方法对平稳的赌博机问题是合适的&#xff0c;即收益的概率分布不随着时间变化的赌博机问题。但如果赌博机的收益概率是随着时间变化的&#xff0c;该方法就不合适。如前所述&#xff0c;我们经常会遇…

Excel VBA开发基本语句说明

前言 VBA&#xff08;Visual Basic for Applications&#xff09;是一种用于编写宏的编程语言&#xff0c;它广泛应用于Microsoft Office套件中的各种应用程序&#xff0c;如Excel、Word、Access和PowerPoint等。在这些应用程序中&#xff0c;VBA可用于自动化任务、定制功能、…

AAOS CarPowerManager

文章目录 提供什么服务&#xff1f; 如何提供的&#xff1f;基础的carpowerpolicyd的服务 提供什么服务&#xff1f; 如何提供的&#xff1f; 作用是什么&#xff1f; 电源管理&#xff0c; 车上面的状态可能有很多中&#xff0c;比如在车库&#xff0c;停车&#xff0c;短时…

douyin ios六神

抖音 ios六神算法&#xff0c; x-gorgon x-khronos x-ladon x-argus x-helios x-medusaios版本的六神算法&#xff0c;以及ios越狱过检测抓包logs插件 {x-helios: xnamv9MBKpjSfng4vnl1kCue1d0RPzLcHcU06Ww7CdrYV6d2, x-gorgon: 840460970000aa8ffefc2ed82fff5b7e9eaefd00598…

贴片电容规格怎么看?

贴片电容规格怎么看&#xff1f; 原理图中的电容参数给的数值&#xff0c;目的是便于分析电路。而采购的电容&#xff0c;所给的参数是一串字母和数字组成的字符串&#xff0c;来料检查人员必须根据料单&#xff0c;判断来料是否合格。有时&#xff0c;在一些面试场合&#xf…

vue3的自定义指令

除了 Vue 内置的一系列指令 (比如 v-model 或 v-show) 之外&#xff0c;Vue 还允许你注册自定义的指令 (CustomDirectives)。 1.自定义指令的目的和简单介绍 自定义指令主要是为了重用涉及普通元素的底层 DOM 访问的逻辑。 一个自定义指令由一个包含类似组件生命周期钩子的对象…

字符串混淆

IDA打开so&#xff0c;在Export里面搜索.datadiv 跟进可以找到混淆的字符串 异或加密的字符串可以直接手动异或恢复 Export里面搜索JNI_OnLoad 如果没有将变量类型改为JavaVM *vm, void *reserved 在这里Load jni.h 一些OLLVM加密的字符串可以直接用Frida来hook function h…

蓝桥杯每日一题2023.11.3

题目描述 承压计算 - 蓝桥云课 (lanqiao.cn) 题目分析 将重量存入a中&#xff0c;每一层从上到下进行计算&#xff0c;用d进行计算列的重量&#xff0c;当前d的重量应为正上数组和右上数组的个半和并加上自身的重量 计算到30层记录最大最小值&#xff0c;进行比例运算即可 …

centos 搭建内网ntp时间服务器

在 CentOS 搭建内网 NTP 时间服务器&#xff0c;你可以按照以下步骤操作&#xff1a; 安装 NTP 服务&#xff1a; 打开终端并以 root 用户身份登录。使用以下命令安装 NTP 服务&#xff1a; sudo yum install ntp配置 NTP 服务器&#xff1a; 打开 NTP 配置文件 /etc/ntp.conf&…

Verilog刷题[hdlbits] :Alwaysblock1

题目&#xff1a;Alwaysblock1 Since digital circuits are composed of logic gates connected with wires, any circuit can be expressed as some combination of modules and assign statements. However, sometimes this is not the most convenient way to describe the…

后端配置跨域怎么配置

在后端配置跨域&#xff0c;需要在服务器的代码中添加相应的设置。以下是几种常见的后端语言的跨域配置方式&#xff1a; Node.js 在使用 Node.js 的 Express 框架时&#xff0c;可以使用 cors 中间件来处理跨域问题。安装 cors 中间件后&#xff0c;在代码中添加如下设置&am…

shopee虾皮跨境电商网站商品数据支持网站后缀(.com.my;.vn;.ph)

作为一名技术爱好者&#xff0c;我们总会遇到各种各样的技术问题&#xff0c;需要寻找合适的技术解决方案。而在互联网时代&#xff0c;我们可以快速通过搜索引擎获取丰富的技术资源和解决方案。然而&#xff0c;在不同的技术分享中&#xff0c;我们常常会遇到质量参差不齐的文…