Vue3 动态路由实现的一种方法

news2024/11/25 21:49:28

动态路由

目的: 根据服务器传回来的数据动态的注册路由信息,登录用户的角色不同生成的菜单不同
使用插件做动态路由的好处: 路由页面增加或者减少时,只需要增加或减少相关的路由文件,不需要再修改代码

  • 服务器返回的信息格式中需要有路由信息"route": "/home/user",,说明该角色有访问"/home/user"路由的权限
// 角色权限
{
 	{
	     "id": 1,
	     "route": "/home/user",
	     "name": "用户管理",
	},
	{
	     "id": 2,
	     "route": "/home/department",
	     "name": "部门管理",
	},
	{
	     "id": 3,
	     "route": "/home/menu",
	     "name": "菜单管理",
	},
	{
	     "id": 4,
	     "route": "/home/role",
	     "name": "角色管理",
	}
}

1. 全局安装coderwhy插件

pnpm i coderwhy -g
// 检查是否安装成功
coderwhy --version
// 1.2.2

2. coderwhy插件使用

在这里插入图片描述

  • 示例
coderwhy add3page_setup index -d src/views/main/system/department
  • 执行命令后会自动生成两个文件
    1. 在命令中指定的目录src/views/main/system/department生成.vue文件
      在这里插入图片描述

    2. 同时自动在router文件夹下生成相同路径、相同文件名的.ts文件
      在这里插入图片描述

  • 组件:index.vue
<template>
  <div class="index">
    <h2>index</h2>
  </div>
</template>

<script setup lang="ts" name="index"></script>

<style scoped>
.index {
}
</style>
  • 路由文件:index.ts
const index = () => import('@/views/main/system/department/index.vue')
export default {
  path: '/main/system/department',
  name: 'index',	// 这里需要修改为department
  component: index,
  children: []
}
  1. 使用插件将所有的路由文件和组件文件全部创建好
    在这里插入图片描述

3. 把所有文件中的路由导出,组成一个数组

import.meta.glob 官网介绍

import type { RouteRecordRaw } from 'vue-router'

function getAllMainRoutes(): RouteRecordRaw[] {
  // 1. 获取所有路由文件,每一个文件对应一个路由,一个文件是一个对象
  const modules: Record<string, any> = import.meta.glob('@/router/main/**/*.ts', {
    eager: true,
    import: 'default'
  })
  // 2.  把文件中中的路由信息放入数组中
  let allRoutes: RouteRecordRaw[] = []
  allRoutes = Object.values(modules)
  return allRoutes
}
  • allRoutes:是所有路由的集合,它是从文件生成的,以后只需要在相应的位置添加vue组件对应的路由文件,这个方法就会自动生成路由的集合

5. 动态生成路由

allRoutes与服务器返回的 角色的路由信息 进行比对,就能生成该角色对应的路由表

// roleMenu:服务器返回的角色权限
function mainAddChildrenRoutes(roleMenu: []): RouteRecordRaw[] {
  const routes: RouteRecordRaw[] = []
  const roleRoutes = getAllMainRoutes()	// 所有的路由
  // 3. 遍历菜单信息,把菜单信息中的url与路由信息中的path进行匹配
  for (const menu of roleMenu) {
    const route = roleRoutes.find((item) => item.path === menu.route)
    if (route) routes.push(route) 
 }
  return routes	// 返回结果是动态路由,下一步只需要将路由加载到路由器中
}

6. 使用动态路由后刷新白屏

  • 刷新页面会导致加载到路由器的动态路由丢失,需要在刷新的同时将动态路由重新加载到路由器
  1. 从登录页面进入时加载一次动态路由(登录的请求完成后,页面跳转之前)
  2. 在pinia加载后,route加载前重新加载一次动态路由到路由器
  • pinia改写
import { createPinia } from 'pinia'
import type { App } from 'vue'
import { useLoginStore } from '@/stores/login'

function setupPinia(app: App<Element>) {
  const pinia = createPinia()
  app.use(pinia)	// 加载pinia
  // 初始化角色菜单,加载路由到路由器
  const loginStore = useLoginStore()
  loginStore.setRoleMenu()
}
export default setupPinia


// main.js
setupPinia(app)

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

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

相关文章

POI数据的处理与分析

POI概念 POI&#xff08;Point of Interest&#xff0c;兴趣点&#xff09;数据指的是地理空间数据中的一类&#xff0c;表示某一具体地点或位置的信息。通常&#xff0c;这些数据包含位置坐标&#xff08;经纬度&#xff09;、名称、地址、类别和其他相关信息。POI 数据广泛应…

毕业设计 深度学习水果识别

文章目录 1 前言2 开发简介3 识别原理3.1 传统图像识别原理3.2 深度学习水果识别 4 数据集5 部分关键代码5.1 处理训练集的数据结构5.2 模型网络结构5.3 训练模型 6 识别效果 1 前言 Hi&#xff0c;大家好&#xff0c;这里是丹成学长&#xff0c;今天做一个 基于深度学习的水果…

算法剖析:双指针

文章目录 双指针算法一、 移动零1. 题目2. 算法思想3. 代码实现 二、 复写零1. 题目2. 算法思想3. 代码实现 三、 快乐数1. 题目2. 算法思想3. 代码实现 四、 盛水最多的容器1. 题目2. 算法思想3. 代码实现 五、有效三角形的个数1. 题目2. 算法思想3. 代码实现 六、 和为 s 的两…

【EXCEL数据处理】000020 案例 保姆级教程,附多个操作案例。EXCEL使用表格。

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 【EXCEL数据处理】000020 案例 保姆级教程&#xff0c;附多个操作案例。…

【强训笔记】day27

NO.1 代码实现&#xff1a; #include<iostream>using namespace std;int n,m; int main() {cin>>n>>m;long long retn;for(int i0;i<m-1;i)retret*(n-1)%109;cout<<ret<<endl;return 0; }NO.2 思路&#xff1a;bfs遍历实现&#xff0c;dis…

Android架构--MVVM

一、开发架构 是什么&#xff1f; 二、Android开发中的架构 具体到Android开发中&#xff0c;开发架构就是描述 视图层、逻辑层、数据层 三者之间的关系和实施&#xff1a; 视图层&#xff1a;用户界面&#xff0c;即界面的展示、以及交互事件的响应。 逻辑层&#xff1a;为…

IL2CPP和Mono的区别

Mono 是一种开源的跨平台 .NET 框架实现&#xff0c;能够执行 C# 代码。Unity 使用 Mono 来处理 C# 脚本&#xff0c;并通过 JIT&#xff08;Just-In-Time&#xff09;即时编译器将托管代码转换为本地机器代码&#xff0c;随后在目标平台上执行 IL2CPP 代表 Intermediate Lang…

《业务三板斧:定目标、抓过程、拿结果》读书笔记3

关于目标&#xff0c;关键是共识目标&#xff1a; 为什么不是共识目标&#xff0c;而是共信目标&#xff1f; 共识目标是指管理者通过沟通&#xff0c;让所有团队成员就目标以及实现目 标的方法达成一致。当个人与组织、个人与个人之间出现“路径选择 差异”的时候&#xff0c;…

算法专题四: 前缀和

目录 1. 前缀和2. 二维前缀和3. 寻找数组的中心下标4. 除自身以外数组的乘积5. 和为k的子数组6. 和可被K整除的子数组7. 连续数组8. 矩阵区域和 博客主页:酷酷学!!! 感谢关注~ 1. 前缀和 算法思路: 根据题意, 创建一个前缀和数组, dp[i] dp[i -1] arr[i], 再使用前缀和数组,…

Go编译为可执行文件

在window下打包成其他系统可运行的文件 1.在window下打包成window下可执行文件 在项目main.go同级目录下&#xff0c;逐条执行以下命令 set CGO_ENABLED0 set GOOSwindows set GOARCHamd64 go build -o main-windows.exe main.go 2.在window下打包成linux 在项目main.go同级目…

Android Codec2 CCodec(十六)C2AllocatorGralloc

这一篇文章我们一起来瞧瞧2D&#xff08;Graphic&#xff09; buffer分配器C2AllocatorGralloc是如何工作的。 1、GraphicBuffer 在Android系统中&#xff0c;GraphicBufferAllocator和GraphicBufferMapper是与图形缓冲区&#xff08;Graphic Buffers&#xff09;管理相关的重…

Python爬取b站视频:验证cookie是否有效

具体代码 import requestsheaders {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0,Referer: https://www.bilibili.com/,Origin: https://www.bilibili.com } def readCooki…

Nginx02-安装

零、文章目录 Nginx02-安装 1、Nginx官网 Nginx官网地址&#xff1a;http://nginx.org/ 2、Nginx下载 &#xff08;1&#xff09;Nginx下载 下载页地址&#xff1a;http://nginx.org/en/download.html &#xff08;2&#xff09;更老版本下载 下载页地址&#xff1a;http…

四、链表————相关算法探讨(持续更新中)

链表中相关算法探讨 前言一、移除链表元素1.1 思路分析1.2 解法探讨1.2.1 直接删除1.2.2 创建虚拟头节点来删除1.2.3 递归版删除 二、反转列表2.1 思路分析2.2 做法2.2.1 创建新链表方式2.2.2 双指针法2.2.3 递归法 三、两两交换链表中的节点3.1 思路分析3.2 解法探讨3.2.1 不使…

重磅 | 清华大学刘知远老师领衔的大模型公开课2024年第二季来了!助教阵容强大,零基础大模型从入门到精通,看这个就够了!

本文由readlecture.cn转录总结。ReadLecture专注于音、视频转录与总结&#xff0c;2小时视频&#xff0c;5分钟阅读&#xff0c;加速内容学习与传播。 更多讲座、采访干货内容&#xff0c;欢迎关注公众号“ReadLecture”获取&#xff01;公众号后台直接回复&#xff0c;可与公众…

RK3568笔记六十四:SG90驱动测试

若该文为原创文章,转载请注明原文出处。 前面有测试过PWM驱动,现在使用两种方式来产生PWM驱动SG90,实现舵机旋转任意角度 方法一:使用硬件PWM 方法二:使用高精度定时器,GPIO模拟PWM. 一、PWM子系统框架 二、SG90控制方法 舵机的控制需要MCU产生一个周期为20ms的脉冲信号…

python实现DES算法

DES算法 一、算法介绍1.1 背景1.2 原理1.3 基本功能函数1.3.1 初始置换函数 I P IP IP1.3.2 f f f 轮函数1.3.3 逆初始置换函数 I P − 1 IP^{-1} IP−1 1.4 子密钥的生成 二、代码实现2.1 子密钥生成实现2.2 DES加解密实现2.3 完整代码 三、演示效果 一、算法介绍 1.1 背景…

SpringBoot框架在旅游管理中的应用与实践

第三章 系统分析 3.1可行性分析 对所有的系统来说&#xff0c;都有可能会受到时间和空间上的制约。所以&#xff0c;我们在设计每一个项目的时候&#xff0c;必须对该系统实行可行性分析&#xff0c;这样不但能够降低项目的危害&#xff0c;还能改降低人力、物力和财力的损耗。…

C++(十七) 多态

一、 多态概念 多态&#xff08;polymorphism&#xff09;&#xff0c;通俗来说&#xff0c;就是多种形态。多态分为编译时多态&#xff08;静态多态&#xff09;和运行时多态&#xff08;动态多态&#xff09;。这里我们重点讲运行时多态&#xff0c;同时简单介绍编译时多态。…

swagger2.9.2 和 springboot3.3.4版本冲突问腿

swagger2.9.2 和 springboot3.3.4版本冲突问腿 问题描述&#xff1a;当我们使用 swagger 2.9.2版本的时候&#xff0c;如果恰好我们使用的 springboot 版本是3.x版本&#xff0c;会出现启动报错的问题 解决办法&#xff1a;直接使用swagger 3.x 版本和 springboot 3.x 版本 …