基于Element-Plus动态配置Menu 菜单栏

文章目录

  • 前言
  • 先看效果
    • 可兼容多级菜单栏(顺便配置多少级)
  • 一、新建组件
  • 二、使用步骤
  • 总结
    • `如有启发,可点赞收藏哟~`


前言

菜单栏配置化
图标配置化参考vite动态配置svg图标及其他方式集合


先看效果

可兼容多级菜单栏(顺便配置多少级)

在这里插入图片描述

一、新建组件

咱分为两个组件,一个母组件menu,还有个子组件sub-menu(兼容多级菜单,递归使用)

  • 新建 components/menu/index.vue
<script lang="ts" src="./index.ts"></script><template><el-menuclass="el-menu-demo":default-active="activeIndex":text-color="textColor":active-text-color="activeTextColor":background-color="bgColor":mode="mode":unique-opened="uniqueOpened":collapse="collapse":router="router":ellipsis="ellipsis"@select="handleSelect"><template v-for="item in menuList" :key="item + 'menu' + item.index"><SubMenu :menu="item"></SubMenu></template></el-menu>
</template>
  • 新建 components/menu/index.ts
import { computed, defineComponent } from "vue";
import type { MenuType } from "@/interface/index";
import { IndexHooks } from "@/composables";
import SvgIcon from "@/components/svg-icon/index.vue";
import { translateRouteTitle } from "@/lang";
import SubMenu from "./sub-menu/index.vue";
export default defineComponent({components: {SvgIcon,SubMenu,},props: {/*** 菜单列表*/menuList: {type: Array<MenuType>,default: [{title: "菜单一",index: "0",icon: "document",subMenu: [{title: "子单一",icon: "document",index: "0-0",subMenu: [{ title: "子单2.1", icon: "document", index: "0-0-0" },{title: "子单2.1",icon: "document",index: "0-0-1",subMenu: [{ title: "子单2.1.1", icon: "document", index: "0-0-1-0" },{ title: "子单2.1.2", icon: "document", index: "0-0-1-1" },],},],},{ title: "子单二", icon: "document", index: "0-1" },],},{title: "菜单二",index: "1",icon: "document",subMenu: [{ title: "子单一", icon: "document", index: "1-0" },{ title: "子单二", icon: "document", index: "1-1" },],},{title: "菜单三",index: "2",icon: "document",},],},/*** 菜单展示模式*/mode: {type: String,default: "vertical", // horizontal - 横向 / vertical - 纵向},/*** 是否水平折叠收起菜单(仅在 mode 为 vertical 时可用)*/collapse: {type: Boolean,default: false,},/*** 是否省略多余的子项(仅在横向模式生效)*/ellipsis: {type: Boolean,default: false,},/*** 菜单的背景颜色(十六进制格式)(已被废弃,使用--bg-color)*/bgColor: {type: String,default: "#545c64",},/*** 文字颜色(十六进制格式)(已被废弃,使用--text-color)*/textColor: {type: String,default: "#fff",},/*** 活动菜单项的文本颜色(十六进制格式)(已被废弃,使用--active-color)*/activeTextColor: {type: String,default: "#ffd04b",},/*** 菜单高亮显示index*/active: {type: String,default: "0-1",},/*** 是否只保持一个子菜单的展开*/uniqueOpened: {type: Boolean,default: false,},/*** 是否启用 vue-router 模式。 启用该模式会在激活导航时以 index 作为 path 进行路由跳转 使用 default-active 来设置加载时的激活项。*/router: {type: Boolean,default: false,},},setup(props, { emit }) {const activeIndex = computed({get: () => props.active,set: (val) => {emit("update:active", val);},});const { menuList } = props;const inDepthValueOfArray = (arr: Array<MenuType>,indexs: Array<string>): Array<MenuType> | MenuType | undefined => {const index = Number(indexs[0]);if (indexs.length > 1) {const val = arr[index].subMenu;indexs.shift();return val && inDepthValueOfArray(val, indexs);} else if (indexs.length === 1) {return arr[index];} else {return arr;}};const { goTo } = IndexHooks();const handleSelect = (key: string, keyPath: string[]) => {if (!menuList) return;const indexs = key.split("-");activeIndex.value = indexs[0];const MenuType = inDepthValueOfArray(menuList, indexs);if (MenuType && !(MenuType instanceof Array)) {// goTo(MenuType?.path || "/", { t: new Date().getTime() });}};return {activeIndex,translateRouteTitle,handleSelect,};},
});
  • 新建 components/menu/sub-menu/index.vue
<script lang="ts" src="./index.js"></script><template><el-sub-menu v-if="menu.subMenu" :index="menu.index"><template #title><SvgIcon v-if="menu.icon" :icon-class="menu.icon" />{{ translateRouteTitle(menu.title) }}</template><templatev-for="subItem in menu.subMenu":key="subItem + 'subItem' + menu.index"><SubMenu :menu="subItem" /></template></el-sub-menu><el-menu-item v-else :index="menu.index"><SvgIcon v-if="menu.icon" :icon-class="menu.icon" />{{ translateRouteTitle(menu.title) }}</el-menu-item>
</template>
  • 新建 components/menu/sub-menu/index.ts
import { defineComponent } from "vue";
import SvgIcon from "@/components/svg-icon/index.vue";
import { translateRouteTitle } from "@/lang";
export default defineComponent({name: "SubMenu",components: {SvgIcon,},props: {menu: {type: Object,required: true,default: {title: "子单一",icon: "document",index: "0-0",subMenu: [{ title: "子单2.1", icon: "document", index: "0-0-0" },{ title: "子单2.1", icon: "document", index: "0-0-1" },],},},},setup() {return {translateRouteTitle,};},
});

二、使用步骤

咱直接以默认值做例子,具体数据可自定义,格式需以menu组件定义的,不然会报错

<script lang="ts" src="./index.ts" /><template><Menu /><!-- <Menu v-model:active="ctiHeaderMenuActive" :menuList="menuList" /> -->
</template>
import { defineComponent, reactive, ref } from "vue";
import Menu from "@/components/menu/index.vue";
export default defineComponent({components: {Menu,},setup() {return {};},
});

总结

如有启发,可点赞收藏哟~

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

系列一、请谈谈你对JVM的理解?Java8的虚拟机有什么更新?

一、请谈谈你对JVM的理解&#xff1f;Java8的虚拟机有什么更新&#xff1f; JVM是Java虚拟机的意思。它是建立在操作系统之上的&#xff0c;由类加载器子系统、本地方法栈、Java栈、程序计数器、方法区、堆、本地方法库、本地方法接口、执行引擎组成。 &#xff08;1&#xff0…

istio安装文档

1、重装命令 istioctl manifest generate --set profiledemo | kubectl delete --ignore-not-foundtrue -f - 2、下载 参考&#xff1a;02、istio部署到k8s中 - 简书 (jianshu.com) 参考 Istio / 入门 curl -L https://istio.io/downloadIstio | ISTIO_VERSION1.20.0 TAR…

春秋云境靶场CVE-2021-41402漏洞复现(任意代码执行漏洞)

文章目录 前言一、CVE-2021-41402描述二、CVE-2021-41402漏洞复现1、信息收集1、方法一弱口令bp爆破2、方法二7kb扫路径&#xff0c;后弱口令爆破 2、找可能可以进行任意php代码执行的地方3、漏洞利用找flag 总结 前言 此文章只用于学习和反思巩固渗透测试知识&#xff0c;禁止…

C#asp.net考试系统+sqlserver

C#asp.net简易考试系统 sqlserver在线考试系统学生登陆 判断学生是否存在 选择课程名 科目 可以进行答题操作&#xff0c;已经考试的课程不能再次答题&#xff0c; 自动根据课程名对应的题库生成试卷界面 加入选项类容 说明文档 运行前附加数据库.mdf&#xff08;或sql生成数…

C51--WiFi模块ESP8266--AT指令

ESP8266 面向物联网应用的&#xff0c;高性价比、高度集成的WiFi MCU 简介&#xff1a; 高度集成&#xff1a; ESP8266EX集成了32位Tensilica 处理器、标准数字外设接口、天线开关、射频balun、功率放大器、底噪放大器、过滤器和电源管理模块&#xff0c;可将所占的PCB空间降…

【 云原生 | K8S 】kubeadm 部署Kubernetes集群

目录 1 环境准备 2 所有节点安装docker 3 所有节点安装kubeadm&#xff0c;kubelet和kubectl 4 部署K8S集群 4.1 查看初始化需要的镜像 4.2 初始化kubeadm 4.3 设定kubectl 4.4 所有节点部署网络插件flannel master&#xff08;2C/4G&#xff0c;cpu核心数要求大于2&am…

Spring Task使用介绍

文章目录 Spring Task介绍cron表达式入门案例Spring Task使用步骤全注解的方式代码开发测试结果 代码仓库 Spring Task 介绍 Spring Task 是Spring框架提供的任务调度工具&#xff0c;可以按照约定的时间自动执行某个代码逻辑。 定位定时任务框架 作用定时自动执行某段Java…

vue3 tsx 项目中使用 Antv/G2 实现多线折线图

Antv/G2 文档 Antv/G2 双折线图 安装 antV-G2 通过 npm 安装 项目中安装 antv/g2 依赖库&#xff1a; npm install antv/g2 --save安装成功&#xff1a; 浏览器引入 可以将脚本下载到本地&#xff0c;也可以直接引入在线资源。 引入在线资源 <!-- 引入在线资源&…

全新的FL studio21.2版支持原生中文FL studio2024官方破解版

FL studio2024官方破解版是一款非常专业的音频编辑制作软件。目前它的版本来到了全新的FL studio21.2版&#xff0c;支持原生中文&#xff0c;全面升级的EQ、母带压线器等功能&#xff0c;让你操作起来更加方便&#xff0c;该版本经过破解处理&#xff0c;用户可永久免费使用&a…

【DevOps】Git 图文详解(一):简介及基础概念

Git 图文详解&#xff08;一&#xff09;&#xff1a;简介及基础概念 1.简介&#xff1a;认识 Git2.基础概念&#xff1a;Git 是干什么的&#xff1f;2.1 概念汇总2.2 工作区 / 暂存区 / 仓库2.3 Git 基本流程2.4 Git 状态 1.简介&#xff1a;认识 Git Git 是当前最先进、最主…

五分钟k8s实战-Istio 网关

istio-03.png 在上一期 k8s-服务网格实战-配置 Mesh 中讲解了如何配置集群内的 Mesh 请求&#xff0c;Istio 同样也可以处理集群外部流量&#xff0c;也就是我们常见的网关。 其实和之前讲到的k8s入门到实战-使用Ingress Ingress 作用类似&#xff0c;都是将内部服务暴露出去的…

计算机网络:网络层ARP协议

在实现IP通信时使用了两个地址&#xff1a;IP地址&#xff08;网络层地址&#xff09;和MAC地址&#xff08;数据链路层地址&#xff09; 问题&#xff1a;已知一个机器&#xff08;主机或路由器&#xff09;的IP地址&#xff0c;如何找到相应的MAC地址&#xff1f; 为了解决…

mac下vue-cli从2.9.6升级到最新版本

由于mac之前安装了 vue 2.9.6 的版本&#xff0c;现在想升级到最新版本&#xff0c;用官方给的命令&#xff1a; npm uninstall vue-cli -g 发现不行。 1、究其原因&#xff1a;从vue-cli 3.0版本开始原来的npm install -g vue-cli 安装的都是旧版&#xff0c;最高到2.9.6。安…

TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案

一、背景需求分析 在工业产业园、化工园或生产制造园区中&#xff0c;周界防范意义重大&#xff0c;对园区的安全起到重要的作用。常规的安防方式是采用人员巡查&#xff0c;人力投入成本大而且效率低。周界一旦被破坏或入侵&#xff0c;会影响园区人员和资产安全&#xff0c;…

QT自定义信号,信号emit,信号参数注册

qt如何自定义信号 使用signals声明返回值是void在需要发送信号的地方使用 emit 信号名字(参数)进行发送 在需要链接的地方使用connect进行链接 ct进行链接

初识Java 18-1 泛型

目录 简单泛型 元组库 通过泛型实现栈类 泛型接口 泛型方法 可变参数和泛型方法 通用Supplier 简化元组的使用 使用Set创建实用工具 本笔记参考自&#xff1a; 《On Java 中文版》 继承的层次结构有时会带来过多的限制&#xff0c;例如&#xff1a;编写的方法或类往往…

Android——模块级build.gradle配置——applicationId和namespace

官方地址&#xff1a; 配置应用模块-applicationId和namespace了解 build.gradle 中的实用设置。https://developer.android.google.cn/studio/build/configure-app-module?hlzh-cn 产生那些异常场景&#xff1a; Android&#xff1a;Namespace not specified. Please spec…

Windows SmartScreen中的漏洞!

&#x1f525;另一个流行漏洞是 CVE-2023-36025 - 绕过 Windows SmartScreen 安全功能&#xff0c;该功能是多个微软产品的网络钓鱼和恶意软件保护组件。 &#x1f47e;有多危险 利用该漏洞&#xff0c;攻击者可以绕过 Windows Defender SmartScreen 检查和相关警告。利用该漏…

ProtocolBuffers(protobuf)详解

目录 前言特点语法定义关键字JSON与Protocol Buffers互相转换gRPC与Protocol Buffers的关系 前言 Protocol Buffers&#xff08;通常简称为protobuf&#xff09;是Google公司开发的一种数据描述语言&#xff0c;它能够将结构化数据序列化&#xff0c;可用于数据存储、通信协议…

mysql数据模型

创建数据库 命令 create database hellox &#xff1a; &#xff08; hellox名字&#xff09; sql语句 创建 数据库 命令 create database hell&#xff1b; 也是创建但是有数据库不创建 命令 create database if not exists hell ; 切换数据库 命令 use hello&…