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
Feb 25 Javascript
javascript dom 操作详解 js加强
Jul 13 Javascript
我的javascript 函数链之演变
Apr 07 Javascript
Prototype源码浅析 Number部分
Jan 16 Javascript
javascript 另一种图片滚动切换效果思路
Apr 20 Javascript
Jquery和BigFileUpload实现大文件上传及进度条显示
Jun 27 Javascript
JavaScript获取css行间样式,内连样式和外链样式的简单方法
Jul 18 Javascript
基于jQuery实现中英文切换导航条效果
Sep 18 Javascript
Angular X中使用ngrx的方法详解(附源码)
Jul 10 Javascript
微信小程序之几种常见的弹框提示信息实现详解
Jul 11 Javascript
微信小程序实现带放大效果的轮播图
May 26 Javascript
JavaScript中clientWidth,offsetWidth,scrollWidth的区别
Jan 25 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中flush()、ob_flush()、ob_end_flush()的区别介绍
2013/02/17 PHP
php上传apk后自动提取apk包信息的使用(示例下载)
2013/04/26 PHP
php 备份数据库代码(生成word,excel,json,xml,sql)
2013/06/23 PHP
php中分页及SqlHelper类用法实例
2017/01/12 PHP
PHP实现批量删除(封装)
2017/04/28 PHP
PHP将数据导出Excel表中的实例(投机型)
2017/07/31 PHP
PHP7扩展开发之基于函数方式使用lib库的方法详解
2018/01/15 PHP
Extjs学习笔记之三 extjs form更多的表单项
2010/01/07 Javascript
javascript 从if else 到 switch case 再到抽象
2010/07/17 Javascript
将form表单中的元素转换成对象的方法适用表单提交
2014/05/02 Javascript
js代码实现无缝滚动(文字和图片)
2015/08/20 Javascript
jQuery 如何给Carousel插件添加新的功能
2016/04/18 Javascript
js判断空对象的实例(超简单)
2016/07/26 Javascript
ros::spin() 和 ros::spinOnce()函数的区别及详解
2016/10/01 Javascript
Node.js Sequelize如何实现数据库的读写分离
2016/10/23 Javascript
vue.js实现请求数据的方法示例
2017/02/07 Javascript
详解react-router4 异步加载路由两种方法
2017/09/12 Javascript
jQuery封装animate.css的实例
2018/01/04 jQuery
JS函数节流和防抖之间的区分和实现详解
2019/01/11 Javascript
TypeScript中的方法重载详解
2019/04/12 Javascript
使用watch在微信小程序中实现全局状态共享
2019/06/03 Javascript
Python中类型检查的详细介绍
2017/02/13 Python
Python编程实现双击更新所有已安装python模块的方法
2017/06/05 Python
python字符串过滤性能比较5种方法
2017/06/22 Python
Python语言实现百度语音识别API的使用实例
2017/12/13 Python
python 含子图的gif生成时内存溢出的方法
2019/07/07 Python
使用pandas读取文件的实现
2019/07/31 Python
在python中对于bool布尔值的取反操作
2020/12/11 Python
乡镇庆八一活动方案
2014/02/02 职场文书
小学综治宣传月活动总结
2014/07/02 职场文书
教师作风整改措施思想汇报
2014/10/12 职场文书
机关作风建设工作总结
2014/10/23 职场文书
初中学生操行评语
2014/12/26 职场文书
Java8中接口的新特性使用指南
2021/11/01 Java/Android
【海涛DOTA解说】EVE女子战队独家录像加ZSMJ神牛两连发
2022/04/01 DOTA
基于CSS制作创意端午节专属加载特效
2022/06/01 HTML / CSS