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 相关文章推荐
WordPress 插件——CoolCode使用方法与下载
Jul 02 Javascript
javascript实现轮显新闻标题链接
Aug 13 Javascript
jQuery 渐变下拉菜单
Dec 15 Javascript
js截取固定长度的中英文字符的简单实例
Nov 22 Javascript
jQuery $.each遍历对象、数组用法实例
Apr 16 Javascript
JS简单随机数生成方法
Sep 05 Javascript
jQuery实现圣诞节礼物动画案例解析
Dec 25 Javascript
js实现图片加载淡入淡出效果
Apr 07 Javascript
使用bootstrap插件实现模态框效果
May 10 Javascript
JavaScript类的继承操作实例总结
Dec 20 Javascript
vue swipeCell滑动单元格(仿微信)的实现示例
Sep 14 Javascript
在antd4.0中Form使用initialValue操作
Nov 02 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 批量添加多行文本框textarea一行一个
2014/06/03 PHP
php+redis实现注册、删除、编辑、分页、登录、关注等功能示例
2017/02/15 PHP
两个比较有用的Javascript工具函数代码
2010/02/17 Javascript
JavaScript中Math对象方法使用概述
2014/01/02 Javascript
点击表单提交时出现jQuery没有权限的解决方法
2014/07/23 Javascript
jquery中ajax使用error调试错误的方法
2015/02/08 Javascript
JavaScript检测上传文件大小的方法
2015/07/22 Javascript
jquery实现鼠标点击后展开列表内容的导航栏效果
2015/09/14 Javascript
Node.js模块封装及使用方法
2016/03/06 Javascript
html5+javascript实现简单上传的注意细节
2016/04/18 Javascript
AngularJS ng-app 指令实例详解
2016/07/30 Javascript
Ionic默认的Tabs模板使用实例
2016/08/29 Javascript
关于jQuery.ajax()的jsonp碰上post详解
2017/07/02 jQuery
微信小程序实现预览图片功能
2020/10/22 Javascript
微信小程序实现页面浮动导航
2019/01/28 Javascript
vue+springboot图片上传和显示的示例代码
2020/02/14 Javascript
Python安装Imaging报错:The _imaging C module is not installed问题解决方法
2014/08/22 Python
对于Python中线程问题的简单讲解
2015/04/03 Python
python实现堆和索引堆的代码示例
2018/03/19 Python
对python模块中多个类的用法详解
2019/01/10 Python
在Qt5和PyQt5中设置支持高分辨率屏幕自适应的方法
2019/06/18 Python
Python 实现数据结构-循环队列的操作方法
2019/07/17 Python
python网络爬虫 Scrapy中selenium用法详解
2019/09/28 Python
Python如何使用Gitlab API实现批量的合并分支
2019/11/27 Python
简单了解Django ORM常用字段类型及参数配置
2020/01/07 Python
Django3中的自定义用户模型实例详解
2020/08/23 Python
Python3读写ini配置文件的示例
2020/11/06 Python
详解python os.path.exists判断文件或文件夹是否存在
2020/11/16 Python
销售类个人求职信范文
2013/09/25 职场文书
2014三八妇女节活动总结
2014/03/01 职场文书
银行服务感言
2014/03/01 职场文书
前台文员职责范本
2014/03/07 职场文书
2015年物资管理工作总结
2015/05/20 职场文书
聘用合同范本
2015/09/21 职场文书
《中华上下五千年》读后感3篇
2019/11/29 职场文书
把77A收信机改造成收音机
2022/04/05 无线电