vue Element左侧无限级菜单实现


Posted in Javascript onJune 10, 2020

最近项目中,要用到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)
  }
  }
}

到此就实现了左侧菜单的无限级了,应为现在给公司写的项目都是权限功能,路由方面呢大家可以随便写,公司项目做了权限:左侧菜单,按钮限制,菜单限制,接口限制目前是四种。
本人只是一个小白,分享在项目中遇到的问题,在百度没有找到好的方法,踩坑分享出来。

到此这篇关于vue Element左侧无限级菜单实现的文章就介绍到这了,更多相关vue Element左侧无限级菜单内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
javascript window.confirm确认 取消对话框实现代码小结
Oct 21 Javascript
JQueryEasyUI Layout布局框架的使用
Apr 08 Javascript
JavaScript不刷新实现浏览器的前进后退功能
Nov 05 Javascript
JS倒计时代码汇总
Nov 25 Javascript
javascript实现限制上传文件大小
Feb 06 Javascript
js对象浅拷贝和深拷贝详解
Sep 05 Javascript
Centos7 中 Node.js安装简单方法
Nov 02 Javascript
jQuery Ajax 实现分页 kkpager插件实例代码
Aug 10 jQuery
bootstrap table实现合并单元格效果
Dec 24 Javascript
jQuery实现简单日历效果
Jul 05 jQuery
JavaScript 绘制饼图的示例
Feb 19 Javascript
JavaScript前端面试组合函数
Jun 21 Javascript
详解用js代码触发dom事件的实现方案
Jun 10 #Javascript
Vue中key的作用示例代码详解
Jun 10 #Javascript
使用JavaScript获取扫码枪扫描得到的条形码的思路代码详解
Jun 10 #Javascript
js 获取扫码枪输入数据的方法
Jun 10 #Javascript
使用Vue Composition API写出清晰、可扩展的表单实现
Jun 10 #Javascript
使用 UniApp 实现小程序的微信登录功能
Jun 09 #Javascript
详解vue高级特性
Jun 09 #Javascript
You might like
php设计模式之命令模式的应用详解
2013/05/21 PHP
PHP获取MySQL执行sql语句的查询时间方法
2018/08/21 PHP
JavaScript isPrototypeOf和hasOwnProperty使用区别
2010/03/04 Javascript
浅谈关于JavaScript的语言特性分析
2013/04/11 Javascript
js实现类似于add(1)(2)(3)调用方式的方法
2015/03/04 Javascript
详解AngularJS中自定义过滤器
2015/12/28 Javascript
AngularJS 整理一些优化的小技巧
2016/08/18 Javascript
Angularjs CURD 详解及实例代码
2016/09/14 Javascript
Angularjs的Controller间通信机制实例分析
2016/11/07 Javascript
PHP+jquery+ajax实现分页
2016/12/09 Javascript
微信小程序开发经验总结(推荐)
2017/01/11 Javascript
原生js编写2048小游戏
2017/03/17 Javascript
微信小程序 蓝牙的实现实例代码
2017/06/27 Javascript
JS 学习总结之正则表达式的懒惰性和贪婪性
2017/07/03 Javascript
js字符串处理之绝妙的代码
2019/04/05 Javascript
React Native 混合开发多入口加载方式详解
2019/09/23 Javascript
[04:22]DOTA2上海特级锦标赛主赛事第四日TOP10
2016/03/06 DOTA
[07:06]2018DOTA2国际邀请赛寻真——卫冕冠军Team Liquid
2018/08/10 DOTA
Python中将字典转换为XML以及相关的命名空间解析
2015/10/15 Python
python使用电子邮件模块smtplib的方法
2016/08/28 Python
在Python中pandas.DataFrame重置索引名称的实例
2018/11/06 Python
浅谈Python中的可迭代对象、迭代器、For循环工作机制、生成器
2019/03/11 Python
pybind11在Windows下的使用教程
2019/07/04 Python
python PIL和CV对 图片的读取,显示,裁剪,保存实现方法
2019/08/07 Python
浅析matlab中imadjust函数
2020/02/27 Python
记一次Django响应超慢的解决过程
2020/09/17 Python
定义css设备类型-Media Queries图表简介及使用方法
2013/01/21 HTML / CSS
罗德与泰勒百货官网:Lord & Taylor
2016/08/12 全球购物
Burberry英国官网:英国标志性奢侈品牌
2017/03/29 全球购物
Coach澳大利亚官方网站:美国著名时尚奢侈品牌
2017/05/24 全球购物
自动化工程专业个人应聘自荐信
2013/09/26 职场文书
物业保安员岗位职责
2014/03/14 职场文书
优秀广告词大全
2014/03/19 职场文书
感恩节寄语2015
2015/03/24 职场文书
学雷锋主题班会教案
2015/08/13 职场文书
CSS3实现的侧滑菜单
2021/04/27 HTML / CSS