vue中如何实现无限级分类菜单,代码是什么?
Admin 2022-10-11 群英技术资讯 729 次浏览
最近项目中,要用到element-ui的无限级分类菜单,根据角色生成不同的递归数据,查阅了网上很多资料,发现很多都不太完整并且没有很多的延伸性。
梳理递归数据
我们一般拿到后台的数据是:1.扁平化数据格式2.递归式数据格式
let arr = [ { name:小七, id:1 }, { name:小八, id:2 }, { name: 小九, id:3 } ]
我们从后台拿到的是这种扁平化处理数据,那我们实现递归菜单的话需要什么数据格式呢,需要格式如下:
let menuItems = [ { name:小七, id:1, children:[ { name: '啥也不是', pid:2 } ] }, { name:小八, id:2, children:[ { name:'随便写哦', pid:3, children:[ { name: '再次深入', pid: 4, children:[ { name: '撒打算', pid:666 } ] } ] } ] }, { name: 小九, id:3 } ]
我们就需要类似于以上的这种数据格式:
扁平化数据转换递归数据,下面贴出我的数据处理方法:
注:应为在网上看到的许多的递归处理方法都不一样,有的文章写于很早很多方法都比较复杂或者代码比较多余
computed: { treeData() { let cloneData = JSON.parse(JSON.stringify(this.tableData)); // 对源数据深度克隆 return cloneData.filter(father => { let branchArr = cloneData.filter(child => father.id == child.pid); //返回每一项的子级数组 branchArr.length > 0 ? (father.children = branchArr) : ""; //如果存在子级,则给父级添加一个children属性,并赋值 return father.pid == 0; //返回第一层 }); } },
其中this.tableData就是后台给到我的扁平化数据,这里将其替换就可以
当时处理此功能时没有考虑到子级或者父级有可能值位udfriend 所以没有做判断,如果想完善此递归数据处理的可以完善一下。
数据处理就要开始写代码了!
这里用到了vue-ement-ui的左侧菜单
老规矩,程序员交流用代码
index.vue
<el-menu background-color="#304156" text-color="#fff" active-text-color="#409eff" :collapse="isActive" :collapse-transition="false" :unique-opened="true" :router="true" :default-active="activePath" > <menu-tree :menuData="treeData" @saveNavStart="saveNavStart"></menu-tree> </el-menu> 这里的激活样式用的是缓存的办法 // 保存链接的激活状态 saveNavStart(activePath) { window.sessionStorage.setItem("activePath", activePath); this.activePath = activePath; }, created() { this.activePath = window.sessionStorage.getItem("activePath"); }
menuTree.vue组件
实现左侧无限级菜单最重要的就是 组件自身调用自身
废话不多说,上代码:
<template> <div> <label v-for="menu in menuData" :key="menu.id"> <el-submenu :index="String(menu.id)" v-if="menu.children"> <template slot="title"> <i class="el-icon-edit"></i> <span>{{menu.menu_name}}</span> </template> <label> <menutree :menuData="menu.children"></menutree> </label> </el-submenu> <el-menu-item :index="menu.path" @click="saveNavStart(menu.path)" v-else> <i class="el-icon-edit"></i> <span>{{menu.menu_name}}</span> </el-menu-item> </label> </div> </template> methods:{ saveNavStart(activePath) { this.$emit('saveNavStart',activePath) } } }
到此就实现了左侧菜单的无限级了,应为现在给公司写的项目都是权限功能,路由方面呢大家可以随便写,公司项目做了权限:左侧菜单,按钮限制,菜单限制,接口限制目前是四种。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章主要为大家详细介绍了微信小程序实现点击出现弹窗,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
Angular Route中怎么提前获取数据?下面本篇文章给大家介绍一下从 Angular Route 中提前获取数据的方法,希望对大家有所帮助!
回调函数是每个前端程序员都应该知道的概念之一。回调可用于数组、计时器函数、promise、事件处理中。本文将会解释回调函数的概念,同时帮你区分两种回调:同步和异步。
Object.freeze(obj)可以冻结一个对象。一个被冻结的对象再也不能被修改;冻结了一个对象则不能向这个对象添加新的属性,不能删除已经属性,不能修改该对象已有属性的可枚举性、可配置性、可写性、以及不能修改已有属性的值。
本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于数组去重的相关问题,包括了es6的set去重、双重for循环去重、indexof去重等等内容,下面一起来看一下,希望对大家有帮助。
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008