当前位置: 首页 > article >正文

Vue3.5 企业级管理系统实战(二十二):动态菜单

在前几篇内容中已完成菜单、角色及菜单权限等相关开发,若要在左侧菜单根据用户角色动态展示菜单,需对 Sidebar 中的相关数据进行修改。鉴于其他相关方法及类型已在前文实现,本文不再重复阐述。

1 修改 Sidebar 组件

在 src/layout/components/Sidebar/index.vue 中修改路由数据来源,更新为动态生成的菜单,代码如下:

//src/layout/components/Sidebar/index.vue
<template><div><!-- 侧边栏Logo组件,根据配置决定是否显示,并响应侧边栏折叠状态 --><logo v-if="sidebarLogo" :collapse="sidebar.opened"></logo><!-- Element UI菜单组件,配置了背景色、文本颜色和激活项颜色 --><el-menuborder-noneclass="sidebar-container-menu":default-active="defaultActive":background-color="variables.menuBg":text-color="variables.menuText":active-text-color="theme":collapse="sidebar.opened"><!-- 动态生成菜单项,menuRoutes包含了所有需要显示的菜单项 --><sidebar-itemv-for="route in menuRoutes":key="route.path":item="route"/><!-- 增加父路径,用于el-menu-item渲染的时候拼接 --></el-menu></div>
</template><script lang="ts" setup>
// 导入应用状态管理相关模块
import { useAppStore } from "@/stores/app";
// 导入样式变量
import variables from "@/style/variables.module.scss";
// 导入设置状态管理
import { useSettingStore } from "@/stores/settings";
// 导入菜单状态管理
import { useMenuStore } from "@/stores/menu";// 获取菜单状态
const meuStore = useMenuStore();// 计算属性:响应式菜单数据,来自状态管理中的权限菜单树
const menuRoutes = computed(() => meuStore.state.authMenuTreeData);// 获取当前路由信息
const route = useRoute();// 获取侧边栏状态(展开/折叠)
const { sidebar } = useAppStore();// 计算属性:当前激活菜单项,默认使用当前路由路径
const defaultActive = computed(() => {// .....return route.path;
});// 获取设置状态
const settingsStore = useSettingStore();
// 计算属性:主题颜色,响应式更新
const theme = computed(() => settingsStore.settings.theme);// 计算属性:侧边栏Logo显示控制,响应式更新
const sidebarLogo = computed(() => settingsStore.settings.sidebarLogo);
</script><style scoped></style>

2 修改 SidebarItem 组件

修改 src/layout/components/Sidebar/SidebarItem.vue 中的路径解析方法,代码如下:

//src/layout/components/Sidebar/SidebarItem.vue
<template><!-- 当菜单项没有设置hidden为true时显示 --><template v-if="!item.meta?.hidden"><!-- 情况1:如果只有一个子菜单且没有设置alwaysShow,直接渲染子菜单项 --><sidebar-item-linkv-if="filteredChildren.length <= 1 && !item.meta?.alwaysShow":to="resolvePath(singleChildRoute.path)"><el-menu-item :index="resolvePath(singleChildRoute.path)"><el-icon v-if="iconName"><!-- 显示菜单项图标 --><svg-icon :icon-name="iconName" /></el-icon><!-- 菜单项标题 --><template #title>{{ singleChildRoute.meta.title }}</template></el-menu-item></sidebar-item-link><!-- 情况2:有多个子菜单或设置了alwaysShow,渲染为下拉菜单 --><el-sub-menu v-else :index="item.path"><template #title><el-icon v-if="iconName"><!-- 父菜单项图标 --><svg-icon :icon-name="iconName" /></el-icon><!-- 父菜单项标题 --><span>{{ item.meta?.title }}</span></template><!-- 递归渲染子菜单项 --><sidebar-itemv-for="child of filteredChildren":key="child.path":item="child"></sidebar-item></el-sub-menu></template>
</template><script lang="ts" setup>
// 导入路径校验工具和菜单项类型定义
import { isExternal } from "@/utils/validate";
import type { ITreeItemDataWithMenuData } from "@/utils/generateTree";// 定义组件props,接收菜单项数据
const { item } = defineProps<{item: ITreeItemDataWithMenuData;
}>();// 计算属性:过滤掉隐藏的子菜单项
const filteredChildren = computed(() =>(item.children || []).filter((child) => !child.meta?.hidden)
);// 计算属性:确定当前要渲染的菜单项
// 如果只有一个子菜单,渲染子菜单;否则渲染当前菜单项
const singleChildRoute = computed(() =>filteredChildren.value.length === 1 ? filteredChildren.value[0] : { ...item }
);// 计算属性:获取菜单项图标
const iconName = computed(() => singleChildRoute.value.meta?.icon);// 路径解析函数:处理菜单项路径
// 外部链接直接返回,内部链接可能需要拼接父路径
const resolvePath = (childPath: string) => {if (isExternal(childPath)) {return childPath;}return childPath;
};
</script>

下一篇将继续探讨 权限指令的实现,敬请期待~ 

http://www.lryc.cn/news/2400642.html

相关文章:

  • 磨皮功能 C++/C的OpenCV 实现
  • 蓝牙防丢器应用方案
  • TDengine 开发指南——高效写入
  • Linux kill 暂停命令
  • Unity与Excel表格交互热更方案
  • LVS、NGINX、HAPROXY的调度算法
  • C++ 使用 ffmpeg 解码本地视频并获取每帧的YUV数据
  • 分布式微服务系统架构第143集:pom文件
  • 2.0 阅读方法论与知识总结
  • 5. Qt中.pro文件(1)
  • 第八部分:第三节 - 事件处理:响应顾客的操作
  • 共识机制全景图:PoW、PoS 与 DAG 的技术对比
  • 学习笔记085——Spring Data JPA笔记
  • 可视化大屏工具对比:GoView、DataRoom、积木JimuBI、Metabase、DataEase、Apache Superset 与 Grafana
  • 内网穿透:打破网络限制的利器!深入探索和简单实现方案
  • 如何选择合适的哈希算法以确保数据安全?
  • 简数采集技巧之快速获取特殊链接网址URL方法
  • React 性能监控与错误上报
  • AI 如何改变软件文档生产方式?
  • 激光干涉仪:解锁协作机器人DD马达的精度密码
  • Windows如何定制键盘按键
  • go语言学习 第1章:走进Golang
  • 使用Prometheus+Grafana+Alertmanager+Webhook-dingtalk搭建监控平台
  • HOPE800系列变频器安装到快速调试的详细操作说明
  • vCenter与ESXi主机每分钟周期性断连修复
  • JMeter函数整理
  • Sql Server 中常用语句
  • web3-区块链困境破解指南:从数字化签名到Rollup 到分片
  • 李飞飞World Labs开源革命性Web端3D渲染器Forge!3D高斯溅射技术首次实现全平台流畅运行
  • 小鹏汽车5月交付新车33525台 同比增长230%