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图片预加载技术(详细演示)
Mar 12 Javascript
js 静态动态成员 and 信息的封装和隐藏
May 29 Javascript
基于jquery的图片轮播 tab切换组件
Jul 19 Javascript
js获取当前路径的简单示例代码
Jan 08 Javascript
使用jQuery的attr方法来修改onclick值
Jul 07 Javascript
JS实现倒计时和文字滚动的效果实例
Oct 29 Javascript
D3.js实现文本的换行详解
Oct 14 Javascript
自学实现angularjs依赖注入
Dec 20 Javascript
AngualrJs清除定时器遇到的坑
Oct 13 Javascript
vue.js实现点击后动态添加class及删除同级class的实现代码
Apr 04 Javascript
jQuery class属性操作addClass()与removeClass()、hasClass()、toggleClass()
Mar 31 jQuery
详解JVM系列之内存模型
Jun 10 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函数(ignore_user_abort)
2012/08/01 PHP
select 控制网页内容隐藏于显示的实现代码
2010/05/25 Javascript
20款效果非常棒的 jQuery 插件小结分享
2011/11/18 Javascript
一个不错的仿携程自定义数据下拉选择select
2014/09/01 Javascript
Jquery常用的方法汇总
2015/09/01 Javascript
JQuery异步加载PartialView的方法
2016/06/07 Javascript
js删除局部变量的实现方法
2016/06/25 Javascript
js-FCC算法-No repeats please字符串的全排列(详解)
2017/05/02 Javascript
JavaWeb表单及时验证功能在输入后立即验证(含用户类型,性别,爱好...的验证)
2017/06/09 Javascript
详解wow.js中各种特效对应的类名
2017/09/13 Javascript
浅谈使用React.setState需要注意的三点
2017/12/18 Javascript
vue.js 打包时出现空白页和路径错误问题及解决方法
2019/06/26 Javascript
Vue  webpack 项目自动打包压缩成zip文件的方法
2019/07/24 Javascript
js的Object.assign用法示例分析
2020/03/05 Javascript
[01:07]2015国际邀请赛 中国区预选赛精彩回顾
2015/06/15 DOTA
python批量提交沙箱问题实例
2014/10/08 Python
Ubuntu 14.04+Django 1.7.1+Nginx+uwsgi部署教程
2014/11/18 Python
Python中的choice()方法使用详解
2015/05/15 Python
python 把文件中的每一行以数组的元素放入数组中的方法
2018/04/29 Python
Django 视图层(view)的使用
2018/11/09 Python
Python线程池模块ThreadPoolExecutor用法分析
2018/12/28 Python
Django实现发送邮件找回密码功能
2019/08/12 Python
Python Numpy库常见用法入门教程
2020/01/16 Python
解决django无法访问本地static文件(js,css,img)网页里js,cs都加载不了
2020/04/07 Python
pycharm 2018 激活码及破解补丁激活方式
2020/09/21 Python
Python实现进度条和时间预估的示例代码
2020/06/02 Python
Python爬虫爬取微博热搜保存为 Markdown 文件的源码
2021/02/22 Python
巧克力领导品牌瑞士莲美国官网:Lindt Chocolate美国
2016/08/25 全球购物
Carolina工作鞋官网:Carolina Footwear
2019/03/14 全球购物
int *p=NULL和*p= NULL有什么区别
2014/10/23 面试题
机电工程学生自荐信范文
2013/12/07 职场文书
质量负责人任命书
2014/06/06 职场文书
社保转移委托书范本
2014/10/08 职场文书
劳模先进事迹材料
2014/12/24 职场文书
辞职信如何写
2015/02/27 职场文书
2015年办公室个人工作总结
2015/04/20 职场文书