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 22 Javascript
JS实现统计复选框选中个数并提示确定与取消的方法
Jul 01 Javascript
KnockoutJs快速入门教程
May 16 Javascript
简单理解vue中Props属性
Oct 27 Javascript
react native实现往服务器上传网络图片的实例
Aug 07 Javascript
react配合antd组件实现的管理系统示例代码
Apr 24 Javascript
详解create-react-app 自定义 eslint 配置
Jun 07 Javascript
vue 2.8.2版本配置刚进入时候的默认页面方法
Sep 21 Javascript
浅谈Node 异步IO和事件循环
May 05 Javascript
js简单实现自动生成表格功能示例
Jun 02 Javascript
微信小程序学习总结(一)项目创建与目录结构分析
Jun 04 Javascript
解决vue prop传值default属性如何使用,为何不生效的问题
Sep 21 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
如何去掉文章里的 html 语法
2006/10/09 PHP
php强制运行广告的方法
2014/12/01 PHP
PHP的Yii框架的常用日志操作总结
2015/12/08 PHP
PHP开发制作一个简单的活动日程表Calendar
2016/06/20 PHP
PHP中in_array函数使用的问题与解决办法
2016/09/11 PHP
php提交表单时保留多个空格及换行的文本样式的方法
2017/06/20 PHP
laravel请求参数校验方法
2019/10/10 PHP
PHP连接MySQL数据库操作代码实例解析
2020/07/11 PHP
XHTML-Strict 内允许出现的标签
2006/12/11 Javascript
js解析与序列化json数据(三)json的解析探讨
2013/02/01 Javascript
JavaScript在IE和FF下的兼容性问题
2014/05/19 Javascript
js仿土豆网带缩略图的焦点图片切换效果实现方法
2015/02/23 Javascript
在AngularJS应用中实现一些动画效果的代码
2015/06/18 Javascript
JS跨域解决方案之使用CORS实现跨域
2016/04/14 Javascript
Vue源码学习之初始化模块init.js解析
2017/11/02 Javascript
jQuery实现带进度条的轮播图
2020/09/13 jQuery
SpringBoot在yml配置文件中配置druid的操作
2020/11/16 Javascript
[02:44]2014DOTA2 国际邀请赛中国区预选赛 大神红毯秀
2014/05/25 DOTA
pyv8学习python和javascript变量进行交互
2013/12/04 Python
python中的装饰器详解
2015/04/13 Python
Python复数属性和方法运算操作示例
2017/07/21 Python
python opencv实现旋转矩形框裁减功能
2018/07/25 Python
使用python Telnet远程登录执行程序的方法
2019/01/26 Python
python绘制双Y轴折线图以及单Y轴双变量柱状图的实例
2019/07/08 Python
python模块常用用法实例详解
2019/10/17 Python
Python函数生成器原理及使用详解
2020/03/12 Python
推荐技术人员一款Python开源库(造数据神器)
2020/07/08 Python
世界领先的艺术图书出版社:TASCHEN
2018/07/23 全球购物
.net软件工程师应聘上机试题
2015/03/10 面试题
一套软件开发工程师笔试题
2015/05/18 面试题
中间件分为哪几类
2016/09/18 面试题
美术教师自我鉴定
2014/02/12 职场文书
诚信贷款承诺书
2014/05/30 职场文书
2015年手术室工作总结
2015/05/11 职场文书
音乐研修感悟
2015/11/18 职场文书
【海涛DOTA解说】EVE女子战队独家录像加ZSMJ神牛两连发
2022/04/01 DOTA