vue-antd-admin加载动态菜单的步骤——vue3动态菜单——技能提升

news2024/11/18 21:50:38

最近在写后台管理系统时,发现老系统有个需求,就是动态加载菜单

以往的静态菜单:路由都放在router/config.js中,菜单页面放在pages里面。

加载的动态菜单:路由是通过接口获取,然后加载到路由中,菜单页面一九放在pages里面。

下面记录一下通过chatGPT获取到的加载动态菜单路由的步骤:
在这里插入图片描述
chatGPT免费使用链接:https://chat.wuguokai.cn/#/chat/1684457211121

前言

vue3-antd-admin是一个基于vue3ant design vue的后台管理系统模板,支持加载动态菜单,下面是加载动态菜单的步骤

1.通过接口获取菜单数据,并将数据存储到vuex

//store/modules/menu.js
import { getMenuList } from '@/api/menu';//调用获取菜单接口
const state = {
	menuList:[],//存放菜单数据
}
const mutations = {
	SET_MENU_LIST(state,menuList){
		state.menuList = menuList;
	}
}
const actions = {
	async fetchMenuList({commit}){
		const res = await getMenuList()
		commit('SET_MENU_LIST',res.data)
	}
}
export default{
	namespaced:true,
	state,
	mutations,
	actions,
}

2.在Router全局前置守卫中动态生成路由

//   router/index.js
import { createRouter,createWebHistory } from 'vue-router'
import store from '@/store'
import NProgress from 'nprogress'//页面加载进度条插件
import 'nprogress/nprogress.css'
import { message } from 'ant-design-vue'

const whiteList = ['/login']

const router = createRouter({
	history:createWebHistory(process.env.BASE_URL),
	routes:[]
})

router.beforeEach(async (to,from,next)=>{
	NProgress.start()	
	document.title = to.meta.title?`${to.meta.title} - Antd Admin`:`Antd Admin`
	if(!store.getters['user/token']&&!whiteList.includes(to.path)){
		next('/login')
	}else if(to.path === '/login'){
		next();
	}else {
		//判断是否已经获取到菜单数据
		if(store.getters['menu/menuList'].length>0){
			next();
		}else {
			try{
				//动态获取菜单数据
				await store.dispatch('menu/fetchMenuList')
				//根据菜单动态生成路由
				const menuList = store.getters['menu/menuList']
				const accessRoutes = generateRoutes(menuList)
				//将动态生成的路由加入到路由表中
				router.addRoute(accessRoutes)
				next({...to,replace:true})
			}catch(error){
				message.error(error||'菜单加载失败,重新登录试试')
				next(`/login?redirect=${to.path}`)
			}
		}
	}
})
function generateRoutes(routes){
	const res = [];
	for(const route of routes){
		const tmp = {...route}
		if(tmp.component){
			if(tmp.component.indexOf('Layout')!==-1){
				tmp.component = Layout;
			}else{
				tmp.component = loadView(tmp.component)
			}
		}
		if(tmp.children){
			tmp.children = generateRoutes(tmp.children)
		}
		res.push(tmp)
	}
	return res
}
export default router

在上面的代码中,我们通过判断是否已经获取到菜单数据来决定是否请求接口获取数据,然后根据菜单数据的动态生成路由并加入路由表中

3.读取菜单数据和路由表

//components/Sidebar/SidebarMenu.vue
<template>
	<a-menu mode="inlinel" theme="dark" :inline-collapsed="collapsed" :selected-keys="[currentPath]"
	v-on:openChange="onOpenChange">
		<a-sub-menu v-for="menu in sideMenus" :key="menu.id" :title="menu.name" v-if="hasChildren(menu)">
			<template #title>
				<app-icon :text="menu.icon" />
				<span>{{menu.name}}</span>
			</template>
			<sidebar-menu-item v-for="child in menu.children" :menu="child" :key="child.path"/>
		</a-sub-menu>
	</a-menu>
</template>
<script>
import { computed,defineComponent,ref } from 'vue'
import { useRouter } from 'vue-router'
import appRoutes from '@/router/routes'
export default defineComponent({
	name:'SidebarMenu',
	components:{
		SidebarMenuItem,
	},
	setup(){
		const router = useRouter();
		const sideMenus = computed(()=>{
			return appRoutes.filter(route=>!route.hidden)
		})
		const currentRoutePath = computed(()=>{
			return router.currentRoute.value.path
		})
		const collapsed = ref(false)
		function hasChildren(menu){
			return menu.children&&menu.children.length>0
		}
		function onOpenChange(openKeys){
			console.log(openKeys)
		}
		return {
			sideMenus,
			currentRoutePath,
			collapsed,
			hasChildren,
			onOpenChange,
		}
	}
})
</script>

在上面代码中,我们先通过 computed(计算属性)读取路由表和菜单数据,然后判断是否有子菜单,并在菜单中循环渲染,需要注意的是,在vue3中,计算属性需要使用computed创建。

这就是加载动态菜单的详细步骤。

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

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

相关文章

凌恩生物美文分享 | Nature教你如何深入开展植物基因组研究,看这篇绝对够!

自三代测序技术面世以来&#xff0c;基因组的相关研究迈上了一个新台阶&#xff0c;无论是完整性、连续性、准确性较二代测序技术组装基因组均有较大的提升。凌恩生物也紧随前沿&#xff0c;整合多种优势技术及信息分析平台&#xff0c;涵盖Illumina&#xff0c;Pacbio等多种测…

阿里主动改革,再次引领国内公司治理新浪潮

北京时间2023年5月18日美股盘前&#xff0c;阿里公布2023财年Q4及全年财报&#xff0c;整体财务状况符合市场预期&#xff0c;但推动组织变革的进度&#xff0c;却给了市场一个“惊喜”。 财报中&#xff0c;阿里宣布了整体组织变革背景下&#xff0c;旗下数个业务的未来方向&…

【HISI IC萌新虚拟项目】Package Process Unit模块整体方案·PART2

4.系统功能和主要技术指标论证 4.1芯片总体结构图 芯片总体结构框图如图2所示。 图 2 packet_process_unit 芯片结构框图 芯片内部主要电路包括 cpu_if 接口电路、sram 检测电路 test_core 以及 spt 包转发接口电 路。以下对主要部分分别进行简要介绍: 1.cpu_if 接口电路 该…

LOTO示波器如何测试阻抗的频响曲线

LOTO示波器如何测试阻抗的频响曲线 模块的输入输出端口&#xff0c;在电路分析上&#xff0c;一般简单表征为电阻来进行计算和分析。但多数情况下&#xff0c;这些端口并不是纯电阻的特性&#xff0c;更精确一些&#xff0c;它可能是电阻电容以及电感的组合&#xff0c;表现为非…

Vite打包优化

关于指标&#xff0c;这里简单介绍下常见的优化指标 FCP&#xff08;First Contentful Paint&#xff09;&#xff1a;白屏时间&#xff08;第一个文本绘制时间&#xff09;Speed Index&#xff1a;首屏时间TTI&#xff08;Time To Interactive&#xff09;: 第一次可交互的时l…

什么是合伙企业?普通合伙和有限合伙区别?

1.什么是合伙企业? 合伙企业是指由各合伙人订立合伙协议&#xff0c;共同出资&#xff0c;共同经营&#xff0c;共享收益&#xff0c;共担风险&#xff0c;并对企业债务承担无限连带责任的营利性组织。合伙企业一般无法人资格&#xff0c;不缴纳企业所得税&#xff0c;缴纳个…

自制0-36V便携电源:typec+pd诱骗

1、芯片选择&#xff1a; 1.1、LDR6321 选用LDR6321&#xff0c;最高诱骗输出20V&#xff0c;手册如下&#xff1a; https://atta.szlcsc.com/upload/public/pdf/source/20211112/6C547DE14631DD2A11892D79A9F4FADD.pdf 该芯片立创商城有售&#xff0c;淘宝也有售&#xff0c…

pix2pixHD

High-Resolution Image Synthesis and Semantic Manipulation with Conditional GANs pix2pixHD提出了一个模型用于从label map中生成真实的photo。 pix2pixHD都是使用的CGAN的思想&#xff0c;不同的是本文可以产生更加高清的图像&#xff0c;pix2pix生成的是256x256&#xf…

js内存泄露

文章目录 定义引起内存泄漏的操作&#xff1a;Chrome 控制台查看内存情况无痕模式PerformanceMemotry1. 先用 Allocation instrumentation on timeline 确认问题2. 再用 Head snapshot 定位代码 闭包函数使用不当 js内存泄露如何检测&#xff1f;场景有哪些&#xff1f;如何定位…

2023年财务管理案例研究与应用(圆桌)论坛在京举办

2023年5月13日&#xff0c;由中国企业财务管理协会、机械工业信息研究院与用友网络科技股份有限公司共同策划的 2023 财务管理案例研究与应用 (圆桌) 论坛在用友产业园成功举办。 国务院国资委财务监管与运行评价局局长李冰&#xff0c;中国企业财务管理协会副会长&#xff08;…

macOS 安装NVM

一、卸载已经安装的node 我用命令brew uninstall node16 发现报错 后面我用where node 发现当时安装node并没有用brew工具安装 于是运用删除文件的方式卸载node sudo rm -rf /usr/local/{bin/{node,npm},lib/node_modules/npm,lib/node,share/man/*/node.*}二、brew 安装nu…

MySQL—日志

文章目录 一、错误日志二、二进制日志2.1 介绍2.2 格式2.3 查看2.4 删除 三、查询日志四、慢查询日志 一、错误日志 错误日志是 MySQL 中最重要的日志之一&#xff0c;它记录了当 mysqld 启动和停止时&#xff0c;以及服务器在运行过程中发生任何严重错误时的相关信息。当数据…

铿锵玫瑰 别样绽放

-----衢州首支飞盘女队成立 5月15日在一个火热既温馨的下午&#xff0c;在衢州市衢江区社会组织服务中心“馨满益足”女工服务站里。首批优秀女性代表集聚一堂举行了衢州铿锵玫瑰飞盘女队沙龙。至此衢州首支飞盘女队正式落地&#xff0c;这支队伍将在今后参加各类女子飞盘比赛…

DevEco Studio 3.1 Release | 动态共享包开发,编译更快,包更小

原文&#xff1a;DevEco Studio 3.1 Release | 动态共享包开发&#xff0c;编译更快&#xff0c;包更小&#xff0c;点击链接查看更多技术内容。 动态共享包&#xff08;HSP&#xff09;开发是DevEco Studio 3.1 Release版本带来的新特性&#xff0c;基于新的编译方式&#xff…

gpt接口新增配额控制

工作内容,不对外开放 场景: 用户使用gpt时会消耗token,我们要求能够在某个地方配置gpt限额,gpt限额有全局限额也有个人配置的限额, 先配置一个默认的全局的限额(所有用户gpt3.5每个月不能超过1000,每天不能超过500,每个小时不能超过100), 用户可以配置用户的限额(该…

RoyalScope-总线工作状况和信号质量“体检”

海量存储、洞悉细微 无间断连续采样、波形和报文记录 内置100MHz示波器&#xff0c;采样率高达100MS/s&#xff0c;精确查看、分析和统计信号波形细节。 无间断连续采样总线上信号&#xff0c;全部无遗漏的解析成报文(包括数据帧、遥控帧、过载帧、错误帧、帧间隔和错误报文)和…

matlab绘制任意位置方位的圆锥

1.前记&#xff1a; 使用surf函数实现指定顶点&#xff0c;圆锥半径&#xff0c;高度的圆锥。 2.代码 为了实现任意位置和方位&#xff0c;使用机器人系统工具箱函数getTransform计算机器人末端正运动的齐次矩阵结果并将其位置和方位赋予要画的圆锥体上。 运行函数&#xff1…

springboot+java博物馆文物管理系统

用户前台进入系统可以进行首页、文物信息、论坛交流、文物资讯、留言反馈、我的、跳转到后台等springboot是基于spring的快速开发框架, 相比于原生的spring而言, 它通过大量的java config来避免了大量的xml文件, 只需要简单的生成器便能生成一个可以运行的javaweb项目, 是目前最…

bug:nodepad++安装hex Editor插件闪退

bug&#xff1a;nodepad安装hex Editor插件闪退 解决办法&#xff1a; 查看是否是自己的hex Editor版本下载错了&#xff08;x86对应x86、x64对应x64&#xff09;如果nodepad版本是v7.6.4&#xff0c;则需要安装0.9.9的hex Editor 0.9.9 winx64版本&#xff1a;https://github.…

一年换 3 份工作,在家躺平半年了!

见字如面&#xff0c;我是军哥&#xff01; 还记得&#xff0c;我之前写的这篇《三年换 3 份工作&#xff0c;再也找不到工作了&#xff01;》文章&#xff1f;上周有一位读者在这篇文章下留言&#xff0c;说自己去年一年换了 3 份工作&#xff0c;目前在家躺了半年了&#xff…