React之动态路由创建以及解决刷新白屏问题

动态路由的创建和动态菜单的创建几乎类似,只不过的是,动态路由需要导入组件。这样才能完成跳转。

动态路由与动态菜单一样都需要封装一个转化函数,将后端传来的数据进行转换,转换成我们需要的格式。

需要导入的依赖

导入路由useRoutes

import {useRoutes} from 'react-router-dom'

导入useEffect, useState进行异步请求和保存路由表

import { useEffect, useState } from 'react'

导入axios

import $api from './request/index'

导入高阶组件进行二级路由的渲染

import withLoadable from './hoc/withLoadable'

导入鉴权组件

import Auth from './components/Auth'

导入登录和首页的组件,因为路由表中的一级路由是登录和首页

const Login = withLoadable(()=>import('./views/Login/Login'))

const Home = withLoadable(()=>import('./views/homePage/Home.jsx'))

在App组件中我们需要返回的是路由表,所以将配置好后的路由表传给useRoutes,

useRoutes中路由表有三个属性:path,element,children

转化函数依旧是使用的是递归来进行动态获取多级路由

1️⃣:首先调用获取路由的接口,并且将获取的数据传送到转换函数中

 const getMenus = async()=>{
    let result = await $api.login.getMenus()
   let RoutesAry =  transformRouter(result.data)
      routes[1].children = RoutesAry
      // 这里可以解决页面按F5出现白屏,需要深拷贝
      setRoutes([...routes])
  }

2️⃣:编写转换函数

 const transformRouter = (RouterList)=>{
    function transform(RouterList){
        if(RouterList && RouterList.length >0){
          RouterList.forEach(item=>{
            if(item.childList&&item.childList.length>0){
              item.childList.forEach(subItem=>{
                const Module = withLoadable(()=>import(`./views${subItem.component}`))
                let routeItem={
                  path:subItem.component,
                  element:<Module></Module>
                }
                RoutesAry.push(routeItem)
                transform(item.childList,RoutesAry)
              })
            }else{
              const Module = withLoadable(()=>import(`./views${item.component}`))
                let routeItem={
                  path:item.component,
                  element:<Module></Module>
                }
                RoutesAry.push(routeItem)
            }
          })
        }
    }
    let RoutesAry = []
    transform(RouterList,RoutesAry)
      return RoutesAry
  }

转化函数的步骤:

- 首先对传进来的RouterList进行遍历,因为我们跳转是从二级路由开始跳转的,所以我们要对传进来的数据进行forEach遍历取里面的二级路由数据。

- 再取得二级路由以后我们需要对二级路由进行判断,如果childList有并且长度需大于0

- childList判断完之后,对childList进行遍历

- 使用高阶组件withLoadable,将二级菜单的组件传输到高阶组件之中。

const Module = withLoadable(()=>import(`./views${subItem.component}`)

- 因为路由表是一个数组包对象的结构,对象里面包括path属性和element属性。所以定一个routeItem对象,将Module组件和subItem.component给对象里的属性进行赋值。

对象创建好后,将routeItem添加到RoutesAry数组中。

注意:这里需要注意的是,如果不递归的话,他只能进行到二级路由,只有递归了,多级路由才能被添加进去。

- 当一级路由没有二级路有的话,我们直接将一级路由添加到RoutesAry数组中。

- 数组转化完成后,将转化好后的数据赋值给一个新数组RoutesAry,并且将这个数组赋值给路由表中一级路由home组件的children属性。


   let RoutesAry =  transformRouter(result.data)
   console.log(result.data);
      routes[1].children = RoutesAry
      // 这里可以解决页面按F5出现白屏,需要深拷贝
      setRoutes([...routes])

注意:我们把路由表配置好后,都要统一用useState保存路由表,然后将路由表传给useRoutes函数

 return useRoutes(routes)

解决首次进入路由白屏的问题:

当我们登录成功后,进入主页面进行路由跳转时我们发现此时页面发生白屏现象。这是因为useState只在组件初次加载的时候进行调用,所以会出现白屏现象,我们只需要将路由表进行一个深拷贝传入setRoutes函数中就可以解决白屏。

 const [routes,setRoutes] = useState([
    {
      path:'/login',
      element:<Login></Login>
    },
    {
      path:'/',
      element:<Auth><Home></Home></Auth>
    }
  ])
  const getMenus = async()=>{
    let result = await $api.login.getMenus()
   let RoutesAry =  transformRouter(result.data)
   console.log(result.data);
      routes[1].children = RoutesAry
      // 这里可以解决页面按F5出现白屏,需要深拷贝
      setRoutes([...routes])
  }

完整的代码:

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【ChatGPT】阿里版 ChatGPT 突然官宣意味着什么?

Yan-英杰的主页 悟已往之不谏 知来者之可追 C程序员&#xff0c;2024届电子信息研究生 目录 阿里版 ChatGPT 突然官宣 ​ ChatGPT 技术在 AI 领域的重要性 自然语言生成 上下文连续性 多语言支持 ChatGPT 未来可能的应用场景 社交领域 商业领域 ​编辑 医疗领域…

网络安全常用术语

肉鸡 肉鸡指的就是被黑客成功入侵并取得控制权限的电脑。黑客们可以随意的控制肉鸡&#xff0c;就像在使用自己的电脑一样&#xff0c;很形象的比喻&#xff0c;就像是养的肉鸡&#xff0c;任黑客宰杀和利用。关键的是&#xff0c;在成为肉鸡后&#xff0c;只要黑客不对电脑进…

linux|进程间通信如何加锁

进程间通信有一种[共享内存]方式&#xff0c;大家有没有想过&#xff0c;这种通信方式中如何解决数据竞争问题&#xff1f;我们可能自然而然的就会想到用锁。但我们平时使用的锁都是用于解决线程间数据竞争问题&#xff0c;貌似没有看到过它用在进程中&#xff0c;那怎么办&…

Java——把数组排成最小的数

题目链接 牛客网在线oj题——把数组排成最小的数 题目描述 输入一个非负整数数组numbers&#xff0c;把数组里所有数字拼接起来排成一个数&#xff0c;打印能拼接出的所有数字中最小的一个。 例如输入数组[3&#xff0c;32&#xff0c;321]&#xff0c;则打印出这三个数字能…

如何提高三维模型OSGB格式转换3DTILES的转换速度和数据质量

如何提高三维模型OSGB格式转换3DTILES的转换速度和数据质量 提高三维模型从OSGB格式转换为3DTILES格式的转换速度和数据质量&#xff0c;可以从以下几个方面进行优化&#xff1a; 1、选用高效的转换工具&#xff1a;选择高效的转换工具是提高转换速度和数据质量的关键。目前市…

【react从入门到精通】深入理解React生命周期

文章目录 前言React技能树React的生命周期是什么React v16.0前的生命周期组件初始化(initialization)阶段组件挂载(Mounting)阶段组件更新(update)阶段组件销毁阶段 React v16.4 的生命周期总结写在最后 前言 在上一篇文章《react入门这一篇就够了》中我们已经掌握了React的基本…

ABTEST平台建设思路与方案

导读 ABTest的作用&#xff1a; 用ABTEST的结果数据&#xff0c;论证是因为某个业务方案的调整&#xff0c;对产品能力的影响。ABTEST是一个过程&#xff0c;只是为了证明改动的效果&#xff0c;其最终的阶段一定是对某个方案进行推全结束实验&#xff0c;避免稳定的业务流程…

docker 安装 datax和datax-web 之 datax-web登录时提示账号或密码错误

docker 安装docker 安装 datax和datax-web 安装教程地址&#xff1a; https://www.cnblogs.com/leihongnu/p/16612273.html 根据该博客的教程安装成功后&#xff0c;登录页面能打开&#xff0c;但是所提供的账户密码一直报错&#xff0c;这个就需要根据日志一步步去寻找原因了…

管理后台项目-07-菜单管理和动态展示菜单和按钮

目录 1-菜单管理 1.1-菜单管理列表 1.2-添加|修改功能 1.3-删除菜单 2-动态菜单按钮展示 2.1-路由文件的整理 2.2-动态展示不同的路由 1-菜单管理 当用户点击菜单管理的时候&#xff0c;会展示当前所有菜单&#xff0c;树型结构展示...并且可以对菜单进行新增编辑删除操…

2023-04-27:用go语言重写ffmpeg的remuxing.c示例。

2023-04-27&#xff1a;用go语言重写ffmpeg的remuxing.c示例。 答案2023-04-27&#xff1a; ffmpeg的remuxing.c是一个用于将多媒体文件从一种容器格式转换为另一种容器格式的命令行工具。它可以将音频、视频和字幕等元素从源文件中提取出来&#xff0c;并按照用户指定的方式…

基于SAM的二次开发案例收集分享

一、AnyLabeling[1]——制作人&#xff1a;vietanhdev AnyLabeling LabelImg Labelme Improved UI Autolabeling AnyLabeling软件是一个集成了YOLO、Segment Anything模型&#xff08;AI支持&#xff09;的高效数据标注工具&#xff0c;它可以通过点击目标的方式完成目标检…

Windows Vscode 远程连接Ubuntu, vscode检测到#include错误请更新includePath的解决方法

&#xff08;闭坑&#xff09;首先&#xff0c;我们要明白一点&#xff0c;就是我们在windows用vscode 远程连接了Ubuntu后&#xff0c;我们的Vscode的环境就是Ubuntu,不再是window了&#xff0c;所以出现问题&#xff0c;应该想到的是Ubuntu上的环境问题&#xff0c;而不是win…

机器学习与深度学习——通过SVM线性支持向量机分类鸢尾花数据集iris求出错误率并可视化

线性支持向量机 先来看一下什么叫数据近似线性可分&#xff0c;如下图所示&#xff0c;蓝色圆点和红色圆点分别代表正类和负类&#xff0c;显然我们不能找到一个线性的分离超平面将这两类完全正确的分开&#xff1b;但是如果将数据中的某些特异点(黑色箭头指向的点)去除之后&a…

根据cadence设计图学习硬件知识day06 了解一些电源转化芯片和 稳压器 和 开关芯片

1. TPL920 (高精度线性稳压器) 1.1.TPL920 介绍 TPL920系列产品是2A大电流、6μVRMS低噪声、高PSRR、高精度线性稳压器&#xff0c;通常具有在2A负载条件下的110 mV超低电压降。这TPL920系列产品同时支持固定输出电压范围从0.8伏到3.95伏&#xff0c;输出电压可调范围为0.8V至…

肝一肝设计模式【四】-- 建造者模式

系列文章目录 肝一肝设计模式【一】-- 单例模式 传送门 肝一肝设计模式【二】-- 工厂模式 传送门 肝一肝设计模式【三】-- 原型模式 传送门 肝一肝设计模式【四】-- 建造者模式 传送门 文章目录 系列文章目录前言一、什么是建造者模式二、举个栗子三、静态内部类写法四、开源框…

内存取证小练习-基础训练

这是题目和wolatility2.6的链接 链接&#xff1a;https://pan.baidu.com/s/1wNYJOjLoXMKqbGgpKOE2tg?pwdybww 提取码&#xff1a;ybww --来自百度网盘超级会员V4的分享 压缩包很小&#xff0c;题目也比较简单基础&#xff0c;可以供入门使用 1&#xff1a;Which volatility…

【QT5:CAN卡通信的上位机-代码练习-收发数据+布局+引用外部库+基础样例(1)】

【QT5:CAN卡通信的上位机-代码练习-收发数据布局引用外部库基础样例1】 1、概述2、实验环境3、自我总结和提升4、事先声明5、效果展示6、代码编写过程&#xff08;1&#xff09;操作步骤部分1、新建工程2、加入外部库&#xff0c;并且加入qt工程中3、ui页面布局4、代码练习5、运…

急急急!Kafka Topic 资源权限紧张怎么办?

我们都知道 Kafka 的 topic 资源比较“贵”&#xff0c;所以一般会给项目 topic 权限限制&#xff0c;按需申请。Milvus 会在建新表时自动申请 kafka topic 资源&#xff0c;这时候自动申请不到怎么办&#xff1f;手动配置 topic 要符合什么规范才能被 Milvus 使用&#xff1f;…

聚观早报|特斯拉向第三方电动车开放充电桩;Epic 诉苹果垄断败诉

今日要闻&#xff1a;特斯拉向第三方电动车开放充电桩&#xff1b;我国全面实现不动产统一登记&#xff1b;Epic 诉苹果垄断败诉&#xff1b;腾讯大股东Naspers再减持近79万股&#xff1b;星巴克中国门店将超过万家 特斯拉向第三方电动车开放充电桩 近日&#xff0c;特斯拉官方…

AlgoC++第七课:手写Matrix

目录 手写Matrix前言1. 明确需求2. 基本实现2.1 创建矩阵2.2 外部访问2.3 <<操作符重载 3. 矩阵运算3.1 矩阵标量运算3.2 通用矩阵乘法3.3 矩阵求逆 4. 完整示例代码总结 手写Matrix 前言 手写AI推出的全新面向AI算法的C课程 Algo C&#xff0c;链接。记录下个人学习笔记…