vue.js与element-ui实现菜单树形结构的解决方法


Posted in Javascript onApril 21, 2018

由于业务需要,要求实现树形菜单,且菜单数据由后台返回,在网上找了几篇文章,看下来总算有了解决办法。

场景:根据业务要求,需要实现活动的树形菜单,菜单数据由后台返回,最后的效果图如下:

vue.js与element-ui实现菜单树形结构的解决方法

后台返回的数据格式是这个样子的:

data=[{
 pID:'1',//父ID
 name:'目录一',
menuID:'m1',//本身ID






isContent:false//判断是否是目录
},
 {
pID:'1',
 name:'目录二',
menuID:'m2',







isContent:false
 },
 {
 pID:'m1',
 name:'目录一--菜单一',
menuID:'m11',







isContent:true
 },
 {
 pID:'m1',
 name:'目录一--目录一',
menuID:'m12',







isContent:false
 },





 {






pID:'m12',
 name:'目录一--目录一--菜单一',
menuID:'m121',






 isContent:true
 },
 {
 pID:'m2',
 name:'目录二--菜单一',
menuID:'m21',







isContent:true
 },
 {
 pID:'m2',
 name:'目录二--菜单二',
menuID:'m22',







isContent:true
 },
 ]

这是一串具有父子关系的数据,首先就是要把这一大串数据转化成树形结构:

tree(){
        let data=[{
              pID:'1',//父ID
              name:'目录一',
              menuID:'m1',//本身ID
  





isContent:false//判断是否是目录
            },
            {
              pID:'1',
              name:'目录二',
              menuID:'m2',
  






isContent:false
            },
            {
              pID:'m1',
              name:'目录一--菜单一',
              menuID:'m11',
  






isContent:true
            },
            {
              pID:'m1',
              name:'目录一--目录一',
              menuID:'m12',
  






isContent:false
            },
  




 {
    





pID:'m12',
              name:'目录一--目录一--菜单一',
              menuID:'m121',
  





 isContent:true
            },
            {
              pID:'m2',
              name:'目录二--菜单一',
              menuID:'m21',
  






isContent:true
            },
            {
              pID:'m2',
              name:'目录二--菜单二',
              menuID:'m22',
  






isContent:true
            },
          ]
        let tree = []
        for(let i=0;i<data.length;i++){
          if(data[i].pID == '1'){
            let obj = data[i]
            obj.list = []
            tree.push(obj)
            data.splice(i,1)
            i--
          }
        }
        menuList(tree)
        console.log(tree)
        function menuList(arr){
          if(data.length !=0){
            for(let i=0; i<arr.length;i++){
              for(let j=0;j<data.length;j++){
                if(data[j].pID == arr[i].menuID){
                  let obj = data[j]
                  obj.list = []
                  arr[i].list.push(obj)
                  data.splice(j,1)
                  j--
                }
              }
              menuList(arr[i].list)
            }
          }
        }
      }

运行完后返回的结构就是这个样子:

[{"pID":"1","name":"目录一","menuID":"m1","isContent":false,"list":[{"pID":"m1","name":"目录一--菜单一","menuID":"m11","isContent":true,"list":[]},{"pID":"m1","name":"目录一--目录一","menuID":"m12","isContent":false,"list":[{"pID":"m12","name":"目录一--目录一--菜单一","menuID":"m121","isContent":true,"list":[]}]}]},{"pID":"1","name":"目录二","menuID":"m2","isContent":false,"list":[{"pID":"m2","name":"目录二--菜单一","menuID":"m21","isContent":true,"list":[]},{"pID":"m2","name":"目录二--菜单二","menuID":"m22","isContent":true,"list":[]}]}]

接下来就要展示了,项目中用的element-ui的导航菜单组件,为了实现这样的树形结构,将每一级的菜单单独作为一个组件,通过判断isContent的值来递归。我直接把代码贴出来

<el-menu 
      theme="dark"
      :default-active="openMenuID"
      :default-openeds="openMenuArr"
      class="el-menu"
     @select="handleSelect">
      <template v-for="(item,index) in menuList">
         <el-submenu :index=item.menuID v-if="item.IsContent">
           <template slot="title">
          <i class="el-icon-menu"></i>
             {{item.name}}
           </template>
           <tree-menu :data="item.list"></tree-menu>
         </el-submenu>
         <el-menu-item :index=item.menuID v-else>{{item.name}}</el-menu-item>
      </template>
    </el-menu>

tree-menu组件的代码:

<template v-for="(menu,index) in data">
      <el-submenu :index=menu.menuID v-if="menu.IsContent">
        <template slot="title">
          <i class="el-icon-plus"></i>
          {{menu.name}}</template>
        <tree-menu :data="menu.list"></tree-menu>
      </el-submenu>
      <el-menu-item v-else :index=menu.menuID>
        {{menu.name}}
      </el-menu-item>
    </template>

总结

以上所述是小编给大家介绍的vue.js与element-ui实现菜单树形结构的解决方法,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Javascript 相关文章推荐
jQuery根据纬度经度查看地图处理程序
May 08 Javascript
JS中prototype关键字的功能介绍及使用示例
Jul 21 Javascript
Jquery实现的角色左右选择特效
May 21 Javascript
JavaScript中的函数重载深入理解
Aug 04 Javascript
jQuery实现TAB选项卡切换特效简单演示
Mar 04 Javascript
JavaScript中的Number数字类型学习笔记
May 26 Javascript
Three.js基础部分学习
Jan 08 Javascript
基于Angular.js实现的触摸滑动动画实例代码
Feb 19 Javascript
微信小程序获取用户openid的实现
Dec 24 Javascript
JS双向链表实现与使用方法示例(增加一个previous属性实现)
Jan 31 Javascript
Jquery滑动门/tab切换实现方法完整示例
Jun 05 jQuery
JavaScript数组 几个常用方法总结
Nov 11 Javascript
JS装饰器函数用法总结
Apr 21 #Javascript
vue 之 .sync 修饰符示例详解
Apr 21 #Javascript
关于echarts在节点显示动态数据及添加提示文本所遇到的问题
Apr 20 #Javascript
vue中v-cloak解决刷新或者加载出现闪烁问题(显示变量)
Apr 20 #Javascript
jQuery中的$是什么意思及 $. 和 $().的区别
Apr 20 #jQuery
vue多页面开发和打包正确处理方法
Apr 20 #Javascript
用ES6的class模仿Vue写一个双向绑定的示例代码
Apr 20 #Javascript
You might like
利用PHP实现图片等比例放大和缩小的方法详解
2013/06/06 PHP
php网站地图生成类示例
2014/01/13 PHP
php使用ob_start()实现图片存入变量的方法
2014/11/14 PHP
PHP实现清除MySQL死连接的方法
2016/07/23 PHP
php通过执行CutyCapt命令实现网页截图的方法
2016/09/30 PHP
PHP asXML()函数讲解
2019/02/03 PHP
JavaScript表单常用验证集合
2008/01/16 Javascript
JavaScript 浮点数运算 精度问题
2009/10/06 Javascript
cument.execCommand()用法深入理解
2012/12/04 Javascript
javascript自适应宽度的瀑布流实现思路
2013/02/20 Javascript
在css加载完毕后自动判断页面是否加入css或js文件
2014/09/10 Javascript
JavaScript学习笔记(三):JavaScript也有入口Main函数
2015/09/12 Javascript
跟我学习javascript的Date对象
2015/11/19 Javascript
AngularJs ng-repeat 嵌套如何获取外层$index
2016/09/21 Javascript
Javascript 闭包详解及实例代码
2016/11/30 Javascript
JS跨域请求外部服务器的资源
2017/02/06 Javascript
js, jQuery实现全选、反选功能
2017/03/08 Javascript
基于jQuery使用Ajax动态执行模糊查询功能
2018/07/05 jQuery
elementUI 设置input的只读或禁用的方法
2018/10/30 Javascript
深入解析ES6中的promise
2018/11/08 Javascript
js的各种数据类型判断的介绍
2019/01/19 Javascript
JavaScript中filter的用法实例分析
2019/02/27 Javascript
详解python3百度指数抓取实例
2016/12/12 Python
利用Python查看目录中的文件示例详解
2017/08/28 Python
python3调用windows dos命令的例子
2019/08/14 Python
使用phonegap获取设备的一些信息方法
2017/03/31 HTML / CSS
牵手50香港:专为黄金岁月的单身人士而设的交友网站
2020/08/14 全球购物
小学生新学期寄语
2014/01/19 职场文书
活动总结格式范文
2014/04/26 职场文书
市政工程技术专业自荐书
2014/07/06 职场文书
村委会贫困证明范本
2014/09/17 职场文书
优秀党员申报材料
2014/12/18 职场文书
2015年母亲节活动总结
2015/02/10 职场文书
教师研修随笔感言
2015/11/18 职场文书
2016年优秀少先队辅导员事迹材料
2016/02/26 职场文书
Python turtle编写简单的球类小游戏
2022/03/31 Python