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高级程序设计 DOM学习笔记
Sep 10 Javascript
JQuery获取浏览器窗口内容部分高度的代码
Feb 24 Javascript
加载远程图片时,经常因为缓存而得不到更新的解决方法(分享)
Jun 26 Javascript
PHP捕捉异常中断的方法
Oct 24 Javascript
通过Ajax使用FormData对象无刷新上传文件方法
Dec 08 Javascript
基于BootStrap栅格栏系统完成网站底部版权信息区
Dec 23 Javascript
jQuery实现大图轮播
Feb 13 Javascript
JavaScript数据结构之广义表的定义与表示方法详解
Apr 12 Javascript
javaScript实现滚动条事件详解
Mar 24 Javascript
vuex 的简单使用
Mar 22 Javascript
vue实现购物车选择功能
Jan 10 Javascript
Vue实现boradcast和dispatch的示例
Nov 13 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
thinkphp实现163、QQ邮箱收发邮件的方法
2015/12/18 PHP
Laravel学习教程之本地化模块
2017/08/18 PHP
Thinkphp5 微信公众号token验证不成功的原因及解决方法
2017/11/12 PHP
浅谈PHP中如何实现Hook机制
2017/11/14 PHP
PHP实现数组转JSon和JSon转数组的方法示例
2018/06/14 PHP
修改发贴的编辑功能
2007/03/07 Javascript
javascript web页面刷新的方法收集
2009/07/02 Javascript
Prototype Template对象 学习
2009/07/19 Javascript
jquery中对表单的基本操作代码
2010/07/29 Javascript
最新28个很棒的jQuery 教程
2011/05/28 Javascript
jquery.post用法之type设置问题
2014/02/24 Javascript
一个不错的js html页面倒计时可精确到秒
2014/10/22 Javascript
javascript引用赋值(地址传值)用法实例
2015/01/13 Javascript
js传值后台中文出现乱码的解决方法
2016/06/30 Javascript
javascript 中的console.log和弹出窗口alert
2016/08/30 Javascript
基于jQuery制作小图标上下滑动特效
2017/01/18 Javascript
BootStrap组件之进度条的基本用法
2017/01/19 Javascript
简单实现js选项卡切换效果
2017/02/09 Javascript
jQuery基于ajax方式实现用户名存在性检查功能示例
2017/02/10 Javascript
用element的upload组件实现多图片上传和压缩的示例代码
2019/02/12 Javascript
快速了解Node中的Stream流是什么
2019/02/13 Javascript
vue点击当前路由高亮小案例
2019/09/26 Javascript
微信小程序getLocation 需要在app.json中声明permission字段
2020/03/03 Javascript
使用js和canvas实现时钟效果
2020/09/08 Javascript
Scrapy爬虫实例讲解_校花网
2017/10/23 Python
flask的orm框架SQLAlchemy查询实现解析
2019/12/12 Python
使用pytorch完成kaggle猫狗图像识别方式
2020/01/10 Python
值类型与引用类型有什么不同?请举例说明?并分别列举几种相应的数据类型
2015/10/24 面试题
What's the difference between deep copy and shallow copy? (深拷贝与浅拷贝有什么区别)
2015/11/10 面试题
学校门卫管理制度
2014/01/30 职场文书
销售会计岗位职责
2014/03/15 职场文书
食品业务员岗位职责
2014/03/18 职场文书
2015年世界无车日活动总结
2015/03/23 职场文书
2015年幼儿园中班开学寄语
2015/05/27 职场文书
高中生社会实践心得体会
2016/01/14 职场文书
2019事业单位个人工作总结范文
2019/08/26 职场文书