vue3 动态添加路由并生成左侧菜单栏

server/2025/3/15 18:39:19/

先说下思路,登录后跳转到基础页面,
每访问一个页面时,会进到路由守卫的方法
守卫进行身份验证,登录成功后才能跳转到静态路由外的页面,否则就重定向回login页面
登录后跳转到基础页面(因为基础页面包含了左侧菜单栏,获取路由后可以更新菜单栏)。先判断是否已经有路由,防止每次进入守卫方法时重复获取路由,最后重定向到登录后的首页

一、创建静态路由,也就是登录页面和基础页面

登录后的页面是base,base里面包含了左侧菜单栏

javascript">import { createRouter, createWebHistory } from 'vue-router'const routes = [{path: '/base',name: 'Base',component: () => import("../views/base/BaseView.vue"),children: [],},{path: '/login',name: 'login',hidden: true,component: () => import('../views/Login.vue'),meta: {requireAuth: false // 是否需要身份验证}}
]const router = createRouter({history: createWebHistory(),routes
});export default router

二、在守卫方法中进行更新路由

我的路由信息只贴了3条,有一级的也有二级的。给大家做个参考
循环拿到路由信息,判断是一级还是二级,一级目录要新增children空数组,不然二级添加不进去

javascript">// 添加全局前置守卫
router.beforeEach((to, from, next) => {var requireAuth = trueconst token = localStorage.getItem('accessToken')let newT = router.options.routes[0];/* 需要在里面动态添加子路由的一个根组,插入的也是这个根组对象 */if (null != to.meta.requireAuth) {requireAuth = to.meta.requireAuth}if (requireAuth && !token) {next('/login')} else {if (to.path != "/login" && to.path != "/") {if (newT.children.length == 0) {//条件保护,防止全局路由守卫死循环执行。//返过来的路由信息const data = [{id: 1,parentId: 0,path: "/terminalList",name: "首页",hidden: false,component: "/terminal/TerminalList",},{id: 2,parentId: 0,path: "/one",name: "一级目录",hidden: false,component: "/base/RightView",},{id: 3,parentId: 2,path: "/terminalSearch",name: "1",hidden: false,component: "/search/TerminalSearch",},]for (let i = 0; i < data.length; i++) {if (data[i].parentId === 0) {newT.children.push({id: data[i].id,parentId: data[i].parentId,path: data[i].path,name: data[i].name,hidden: data[i].hidden,component: () => import('../views' + data[i].component + '.vue'),children: []}) //给子路由添加一条数据router.addRoute(newT);} else {var Pid = newT.children.length - 1let newR = router.options.routes[0].children[Pid];newR.children.push({id: data[i].id,parentId: data[i].parentId,path: data[i].path,name: data[i].name,hidden: data[i].hidden,component: () => import('../views' + data[i].component + '.vue'),}) //给子路由添加一条数据router.addRoute(newR);}}next({path: '/terminalList',replace: true});} else {next()}}else {next()}}
})

三、菜单栏展示,因为每个一级目录都有children。但首页菜单只有一个,没有下拉菜单

比如这样:
在这里插入图片描述

所以菜单展示的时候,判断下children的长度,没有值就只展示一个菜单

在这里插入图片描述


http://www.ppmy.cn/server/175232.html

相关文章

linux 命令 case

在 Linux Shell 脚本中&#xff0c;case 是一个强大的多条件分支控制命令&#xff0c;用于基于模式匹配执行不同代码块。它类似于其他编程语言中的 switch-case 语句&#xff0c;但更灵活&#xff0c;支持通配符和模式组合。以下是其核心用法和实 一、基础语法 case 变量 in …

基于相量测量单元(PMU)的电力系统故障分析MATLAB仿真

“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 模型简介&#xff1a; PMU是用于电力系统状态估计的Matlab函数&#xff0c;特别是使用相量测量单元(PMU)数据来估计系统的状态。它的主要功能是通过处理来自电网各个节点的测量数据来估计电网的电压大小和相角。此模…

基于Java 童装在线销售系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要&#xff1a; 当今社会进入了科技进步、经济社会快速发展的新时代。国际信息和学术交流也不断加强&#xff0c;计算机技术对经济社会发展和人民生活改善的影响也日益突出&#xff0c;人类的生存和思考方式也产生了变化。传统购物管理采取了人工的管理方法&#xff0c;但这…

策略模式(Strategy Pattern)与状态模式(State Pattern)的异同

相同点 行为委托 两者均通过将行为委托给其他对象来实现功能解耦&#xff0c;遵循“组合优于继承”的原则。 策略模式&#xff1a;将算法逻辑委托给具体的策略类。 状态模式&#xff1a;将状态相关的行为委托给具体的状态类。 类结构相似 两者在类图结构上高度相似&#xff…

C#—【在不同的场景该用哪种线程?】

C#—【在不同的场景该用哪种线程&#xff1f;】 在C#中有很多种线程操作方法但都运用在不同的场景。 以下是针对不同场景选择 线程&#xff08;Thread&#xff09;、线程池&#xff08;ThreadPool&#xff09;、异步编程&#xff08;async/await&#xff09; 或 后台线程&…

IDEA中链接使用mysql数据库

一、连接mysql 1. 打开idea&#xff0c;在右上角侧边栏有数据库database插件&#xff0c;打开侧边栏点击加号->数据源&#xff0c;可以看到支持很多数据库&#xff0c;选择mysql。 2. 首次使用需要下载驱动程序&#xff0c;不然连接数据库会报错。找到mysql&#xff0c;点击…

STM32U575RIT6单片机(三)

作业1&#xff1a;使用中断控制光电开关打开蜂鸣器 volatile int flag0; //重写中断回调函数 void HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin) //void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin) {if(GPIO_PinPhotoElectric_Pin){flag1;} } void HAL_GPIO_EXTI_Fall…

HADOOP环境配置关闭防火墙

关闭防火墙 为了避免出现网络不通的问题&#xff0c;我们可以简单的在集群内部关闭防火墙 输入下面指令 # 关闭防火墙 systemctl stop firewalld #关闭开机自启 systemctl disable firewalld