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实现检测指定目录是否存在的方法
Jan 12 Javascript
javascript 写类方式之五
Jul 05 Javascript
用jquery实现的模拟QQ邮箱里的收件人选取及其他效果(一)
Jan 06 Javascript
基于javascript实现窗口抖动效果
Jan 03 Javascript
JavaScript 浏览器兼容性总结及常用浏览器兼容性分析
Mar 30 Javascript
JS获取随机数和时间转换的简单实例
Jul 10 Javascript
Bootstrap中点击按钮后变灰并显示加载中实例代码
Sep 23 Javascript
微信小程序开发实战教程之手势解锁
Nov 18 Javascript
canvas 画布在主流浏览器中的尺寸限制详细介绍
Dec 15 Javascript
H5实现仿flash效果的实现代码
Sep 29 Javascript
Node.js文件编码格式的转换的方法
Apr 27 Javascript
浅谈node.js中间件有哪些类型
Apr 29 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合并静态文件详解
2014/11/14 PHP
php禁止某ip或ip地址段访问的方法
2015/02/25 PHP
PHP实现伪静态方法汇总
2016/01/13 PHP
PHP框架性能测试报告
2016/05/08 PHP
PHP处理CSV表格文件的常用操作方法总结
2016/07/01 PHP
在Ubuntu 18.04上安装PHP 7.3 7.2和7.0的方法
2019/04/09 PHP
一个js写的日历(代码部分网摘)
2009/09/20 Javascript
js限制文本框输入长度两种限制方式(长度、字节数)
2012/12/19 Javascript
关于include标签导致js路径找不到的问题分析及解决
2013/07/09 Javascript
JavaScript事件委托的技术原理探讨示例
2014/04/17 Javascript
JavaScript高级程序设计(第三版)学习笔记6、7章
2016/03/11 Javascript
Bootstrap字体图标无法正常显示的解决方法
2016/10/08 Javascript
jquery 多个radio的click事件实例
2016/12/03 Javascript
Bootstrap DateTime Picker日历控件简单应用
2017/03/25 Javascript
解析Vue2 dist 目录下各个文件的区别
2017/11/22 Javascript
详解微信小程序缓存--缓存时效性
2019/05/02 Javascript
node.js中事件触发器events的使用方法实例分析
2019/11/23 Javascript
vue中实现动态生成二维码的方法
2020/02/21 Javascript
京东优选小程序的实现代码示例
2020/02/25 Javascript
[02:40]DOTA2殁境神蚀者 英雄基础教程
2013/11/26 DOTA
动感网页相册 python编写简单文件夹内图片浏览工具
2016/08/17 Python
python通过cookie模拟已登录状态的初步研究
2016/11/09 Python
python dataframe 输出结果整行显示的方法
2018/06/14 Python
浅谈django url请求与数据库连接池的共享问题
2019/08/29 Python
python中的列表和元组区别分析
2020/12/30 Python
纯HTML+CSS3制作导航菜单(附源码)
2013/04/24 HTML / CSS
HTML5新增的8类INPUT输入类型介绍
2015/07/06 HTML / CSS
html5 canvas移动浏览器上实现图片压缩上传
2016/03/11 HTML / CSS
美味咖啡的顶级烘焙师:Cafe Britt
2018/03/15 全球购物
Sperry澳大利亚官网:源自美国帆船鞋创始品牌
2019/07/29 全球购物
赔偿协议书范本
2014/09/12 职场文书
勤俭节约倡议书范文
2015/04/29 职场文书
社会主义核心价值观主题教育活动总结
2015/05/07 职场文书
班级联欢会主持词
2015/07/03 职场文书
python实现简单倒计时功能
2021/04/21 Python
OpenCV-Python实现轮廓拟合
2021/06/08 Python