Vue:Elemenu-Plus递归型菜单组件封装

news2024/11/16 4:35:25

        前端开发中,经常遇到需要与后端配置,前端动态渲染菜单的应用场景,而究其本质,就是菜单组件的应用,只是在不确定菜单级数的情况下,我们需要对组件做一个递归处理,让它能够适应大多数应用场景。

递归型菜单举例

         如上图所示,以Element-Plus组件库为例,对于一个递归型菜单,我们该如何进行封装呢?先假设后端接口返回的简单菜单信息如下,

[
            {
                index: "1",
                path: "/index",
                routeParams: {},
                meta: {
                    title: "首页",
                    icon: "House",
                }
            },
            {
                index: "2",
                path: "/funcs",
                routeParams: {},
                meta: {
                    title: "功能中心",
                    icon: "Menu",
                }
            },
            {
                index: "3",
                path: "/cases",
                routeParams: {},
                meta: {
                    title: "项目案例",
                    icon: "Grid",
                    mode:"vertical",
                },
                children: [
                    {
                        index: "3-1",
                        path: "",
                        routeParams: {},
                        meta: {
                            title: "item one",
                            icon: "Orange",
                        },
                        children:[
                            {
                                index: "3-1-1",
                                path: "",
                                routeParams: {},
                                meta: {
                                    title: "item one-one",
                                    icon: "Orange",
                                },
                            }
                        ]
                    },
                    {
                        index: "3-2",
                        path: "",
                        routeParams: {},
                        meta: {
                            title: "item two",
                            icon: "Orange",
                        }
                    },
                    {
                        index: "3-3",
                        path: "",
                        routeParams: {},
                        meta: {
                            title: "item three",
                            icon: "Orange",
                        }
                    }
                ]
            }
        ]

        实际开发中,还可能包括组件路径、菜单项显隐等相关字段信息,此处暂不考虑,我们当前的核心需求是:如何去完成这样的一个菜单组件的封装。

        对于上图所示的效果,我在此处所做的组件封装示例代码如下,

<!-- 多级菜单组件抽取 -->
<template>
    <el-menu :default-active="activeIndex" :class="customMenuClass" background-color="transparent" text-color="#fff"
        active-text-color="#ffef40" :mode="mode" @select="handleSelect" :ellipsis="false">
        <template v-for="(item) in items">
            <template v-if="item.children">
                <el-sub-menu :index="item.index" popper-class="el-sub-menu-popper-class">
                    <template #title>
                        <router-link :to="item.path">
                            <el-icon>
                                <component :is="item.meta.icon" :size="24"></component>
                            </el-icon>
                            <span>{{ item.meta.title }}</span>
                        </router-link>
                    </template>
                    <menu-list :items="item.children" :mode="item.meta.mode"></menu-list>
                </el-sub-menu>
            </template>
            <template v-else>
                <el-menu-item :index="item.index" :key="item.path">
                    <router-link :to="item.path">
                        <el-icon>
                            <component :is="item.meta.icon" :size="24"></component>
                        </el-icon>
                        <span>{{ item.meta.title }}</span>
                    </router-link>
                </el-menu-item>
            </template>
        </template>
    </el-menu>
</template>
<script>
export default {
    name: "menu-list",
    props: {
        customMenuClass: {
            type: String,
            required: false,
            default: "el-menu-class",
        },
        mode: {
            type: String,
            default: "horizontal",
        },
        items: {
            type: Array,
            required: true,
        },
        activeIndex: {
            type: String,
            required: false,
            default: "",
        }
    },
    data() {
        return {}
    },
    methods: {
        handleSelect(key, keyPath, menuItem) {
            this.$emit("select",{key, keyPath, menuItem})
        }
    }

}
</script>
<style lang="scss" scoped>
.el-menu-class {
    .el-menu-item:not(.is-disabled):hover {
        background-color: rgba(127, 255, 212, .3);
    }
}
</style>
<style lang="scss">
.el-sub-menu-popper-class {
    background-color: $base-background-color !important;
}
</style>

        使用示例如下,

//menuList变量对应的就是文章开头处给出的示例数据
 <MenuList :items="menuList" active-index="1" mode="horizontal"/>

        最终,我们就能完成这样的一个递归型菜单组件了,但是对于菜单的样式,可以根据实际需要进行定制。

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

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

相关文章

9.17UEC++代码段、编码和字符串

1. 编码定义&#xff1a; 自行转码&#xff1a; 字符串&#xff1a; FName&#xff1a;名称&#xff0c;访问快&#xff0c;用FName做键值。&#xff08;键值容器&#xff09;资产名称基本都是FName。 FText&#xff1a;一般是和UI有关&#xff0c;专门对接UI&#xff0c;也是…

IDEA动态调试WebLogic

IDEA动态调试WebLogic 环境&#xff1a;Windows 10 Windows7(192.168.52.181) Idea WebLogic12.2.1.4 Java8102 0x01 安装weblogic 安装成功后&#xff0c;在domains下的bin目录下有个startWebLogic.cmd文件 0x02 配置被调试端 0x0201 添加调试参数 2.1.1 方式一 在…

基于单片机智能衣柜 智能衣橱 换气除湿制系统紫外线消毒的设计与实现

功能介绍 以51单片机作为主控系统&#xff1b;液晶显示当前衣柜温湿度和柜门开启关闭状态&#xff1b;按键设置当前衣柜湿度上限值、衣柜门打开和关闭&#xff0c;杀菌消毒&#xff1b;当湿度超过设置上限&#xff0c;继电器闭合开启风扇进行除湿&#xff1b;进行杀菌消毒时&am…

7.5 cloneGitHub项目到服务器端/wget/print/spikes_max

在机器学习和深度学习中&#xff0c;位量化&#xff08;Bit Quantization&#xff09;是一种将模型参数或激活值表示为较低精度的二进制数的技术。通常情况下&#xff0c;模型的参数和激活值是以浮点数形式存储和计算的&#xff0c;占用较大的存储空间和计算资源。位量化通过减…

找不到vcruntime140.dll无法继续执行代码的解决方法

计算机提示找不到vcruntime140.dll无法继续执行代码是什么原因呢&#xff1f;在我们运行photoshop&#xff0c;数据库的时候&#xff0c;电脑提示找不到vcruntime140.dll是由于电脑系统中的Microsoft Visual C Redistributable包损坏&#xff0c;vcruntime140.dll是Microsoft V…

(8)基础强化:内存流,压缩流,序列化,资料管理器,编码,File类,文件流,文本流

一、内存流 1、为什么要有内存流&#xff1f; 答&#xff1a;内存流(MemoryStream)是一个特殊的流&#xff0c;它将数据存储在内存中而不是磁盘或网络。 使用内存流的主要原因和使用场景包括&#xff1a; 内存操作&#xff1a; …

故障:启动修复无法修复你的电脑

有台笔记本很久没用了无法开机了&#xff0c;还是用的win7的系统&#xff0c;开机后提示我使用启动修复&#xff0c;但是失败了&#xff0c;提示我启动修复无法修复你的电脑 启动修复无法修复你电脑怎么办_自动修复电脑未正确启动的解决方法&#xff0d;win7之家 1、上网查了下…

Go语言程序设计(十七)并发编程

一、操作系统提供的并发基础 1、进程 进程是在并发环境下,程序的一次动态执行过程。它由进程控制块(PCB)、程序和数据三部分组成&#xff0c;进程在它的生命周期内可能处于执行、就绪、阻塞三种基本状态。 在多任务操作系统中,多个进程可以并发执行,而且进程是系统资源…

<数据结构>NO9.选择类排序|直接选择排序|堆排序

文章目录 选择排序1.直接选择排序优化直接选择排序 2. 堆排序 选择排序 基本思想 选组排序是从待排序数据中选出最大/最小的元素放入到序列的起始位置&#xff0c;直到待排序数据全部有序。 直接选择排序和堆排序的基本思想均符合选择排序。 1.直接选择排序 假设数据按升序…

Codeforces Round 883 (Div. 3)

A. Rudolph and Cut the Rope 只需要按照钉子距离的高度a_{i}和绳子的长度b_{i}的差值进行排序即可 代码 int n; pii a[N]; bool cmp(pii a,pii b) {return a.x-a.y<b.x-b.y; }void solve() {cin>>n;for(int i1;i<n;i)cin>>a[i].x>>a[i].y;sort(a1,…

36.RocketMQ之Broker如何实现磁盘文件高性能读写

highlight: arduino-light Broker读写磁盘文件的核心技术:mmap Broker中大量的使用mmap技术去实现CommitLog这种大磁盘文件的高性能读写优化的。 通过之前的学习&#xff0c;我们知道了一点&#xff0c;就是Broker对磁盘文件的写入主要是借助直接写入os cache来实现性能优化的&…

如何判断开发的商城系统是不是O2O平台?

纵观如今各大电商模式&#xff0c;数O2O发展最为火热&#xff0c;毫不夸张的说&#xff0c;O2O模式已经渗透到了很多行业中&#xff0c;那么哪些平台属于O2O呢?小编收集了一些资料&#xff0c;并将当下O2O平台分为以下这4种类型&#xff0c;下面小编就来带大家一起去了解了解!…

多模态系列论文--CoCa 详细解析

论文地址&#xff1a;CoCa: Contrastive Captioners are Image-Text Foundation Models 代码地址&#xff1a;CoCa CoCa 1 摘要2 网络结构3 损失函数4 实验结果5 总结 1 摘要 CoCa代表Contrastive Captioners的缩写&#xff0c;代表模型用两个目标函数训练出来的&#xff0c;一…

回溯法解决地图填色问题

目录 回溯法 最大度优先 最少可选颜色优先 向前探测 随机产生不同规模的图&#xff0c;分析算法效率与图规模的关系&#xff08;四色&#xff09; 回溯法 回溯法的基本思想是采用递归和深度优先搜索的方法&#xff0c;尝试在一组可能的解中搜索出符合要求的解&#xff0c…

Langchain的新课程;Mozilla开发的AI文档工具遭到开发者批评

&#x1f989; AI新闻 &#x1f680; Mozilla开发的AI文档工具遭到开发者批评&#xff0c;已下线 摘要&#xff1a;Mozilla开发的基于生成式AI的工具AI Help在开发者群体中遭到广泛批评。开发者认为该工具提供的信息常常错误&#xff0c;甚至认为它没有这个功能反而更好。针对…

Flutter 仿抖音、豆瓣、知乎、番茄小说的评论弹窗开发实践

最近用flutter做了一个评论弹窗的功能&#xff0c;本来以为很简单的烂大街的一个功能&#xff0c;结果却遇到了不少的问题&#xff0c;而且这些问题我觉得很有意义&#xff0c;以至于我觉得我如果分享出来可能会对其他人很有帮助。 要做一件事情可能会很容易&#xff0c;但做好…

ModaHub魔搭社区: AI模型社区ModelScope和Hugging Face行业分析报告

目录 引言&#xff1a; 一、github星数&#xff1a; 二、模型数&#xff1a; 三、数据集&#xff1a; 四、演示应用程序数&#xff1a; 五、下载数&#xff1a; 六、开发者、付费企业和公司用户数&#xff1a; 结论&#xff1a; 引言&#xff1a; AI模型开源社区在近年…

MQTT资料储备

1、官网 https://mqtt.org/ MQTT 5.0官方协议 https://docs.oasis-open.org/mqtt/mqtt/v5.0/mqtt-v5.0.html 说明&#xff1a;官网可以获取到好多资料&#xff08;比如常用软件、协议、usecase等&#xff09; 2、安装部署EMQX 当前有好多MQTT服务器&#xff0c;初步选择了EM…

MyBatis查询数据库【秘籍宝典】

0.MyBatis执行流程1.第一个MyBatis查询1.创建数据库和表1.2.添加MyBatis框架依赖【新项目】1.3.添加MyBatis框架依赖【旧项目】1.4.配置连接数据库1.5.配置MyBatis的XML路径2.MyBatis模式开发2.1 添加MyBatis的xml配置 3.增查改删&#xff08;CRUD&#xff09;5.1.增加操作5.2.…

机器学习之多元微积分

机器学习的多元微积分跟高等数学中的多元微积分有很多不同之处。 机器学习中的变量都是向量或者矩阵机器学习中的函数一般都是线性函数&#xff0c;而不是高数中的曲线和曲面、体积等函数。因此&#xff0c;机器学习中的微积分跟线性代数结合在一起。机器学习中导数的分子分母…