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 相关文章推荐
jQuery学习4 浏览器的事件模型
Feb 07 Javascript
js中传递特殊字符(+,&amp;)的方法
Jan 16 Javascript
浅谈Javascript的静态属性和原型属性
May 07 Javascript
JavaScript调用客户端Java程序的方法
Jul 27 Javascript
学习JavaScript设计模式(继承)
Nov 26 Javascript
JS取数字小数点后两位或n位的简单方法
Oct 24 Javascript
完美解决spring websocket自动断开连接再创建引发的问题
Mar 02 Javascript
Vuejs仿网易云音乐实现听歌及搜索功能
Mar 30 Javascript
将jquery.qqFace.js表情转换成微信的字符码
Dec 01 jQuery
JS+CSS实现滚动数字时钟效果
Dec 25 Javascript
详解基于vue的服务端渲染框架NUXT
Jun 20 Javascript
Vue.js实现双向数据绑定方法(表单自动赋值、表单自动取值)
Aug 27 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定时执行计划任务的多种方法小结
2011/12/19 PHP
通过curl模拟post和get方式提交的表单类
2014/04/23 PHP
零基础php编程好学吗
2019/10/11 PHP
jQuery lazyload 的重复加载错误以及修复方法
2010/11/19 Javascript
js给dropdownlist添加选项的小例子
2013/03/04 Javascript
Javascript学习笔记之函数篇(四):arguments 对象
2014/11/23 Javascript
js实现的捐赠管理完整实例
2015/01/20 Javascript
JS模拟键盘打字效果的方法
2015/08/05 Javascript
Bootstrap每天必学之下拉菜单
2015/11/25 Javascript
jsonp跨域请求数据实现手机号码查询实例分析
2015/12/12 Javascript
简单讲解jQuery中的子元素过滤选择器
2016/04/18 Javascript
NodeJS实现客户端js加密
2017/01/09 NodeJs
js中的事件委托或是事件代理使用详解
2017/06/23 Javascript
nodejs操作mongodb的增删改查功能实例
2017/11/09 NodeJs
Vue项目中设置背景图片方法
2018/02/21 Javascript
Vue中Quill富文本编辑器的使用教程
2018/09/21 Javascript
微信小程序发布新版本时自动提示用户更新的方法
2019/06/07 Javascript
JS实现横向轮播图(初级版)
2020/06/24 Javascript
Vue过渡效果之CSS过渡详解(结合transition,animation,animate.css)
2020/02/05 Javascript
vue实现数字滚动效果
2020/06/29 Javascript
如何在postman中添加cookie信息步骤解析
2020/06/30 Javascript
Python数据分析之如何利用pandas查询数据示例代码
2017/09/01 Python
Python3实现的反转单链表算法示例
2019/03/08 Python
python虚拟环境的安装和配置(virtualenv,virtualenvwrapper)
2019/08/09 Python
python3.8下载及安装步骤详解
2020/01/15 Python
什么是Rollback Segment
2013/04/22 面试题
技术副厂长岗位职责
2013/12/26 职场文书
校园达人秀策划书
2014/01/12 职场文书
城市轨道交通工程职业规划书范文
2014/01/18 职场文书
2014五一国际劳动节活动总结范文
2014/04/14 职场文书
个人安全承诺书
2014/05/22 职场文书
2015年英语教研组工作总结
2015/05/23 职场文书
阳光体育运动标语口号
2015/12/26 职场文书
浅谈Redis主从复制以及主从复制原理
2021/05/29 Redis
Pandas 稀疏数据结构的实现
2021/07/25 Python
TaiShan 200服务器安装Ubuntu 18.04的图文教程
2022/06/28 Servers