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 相关文章推荐
一段多浏览器的&quot;复制到剪贴板&quot;javascript代码
Mar 27 Javascript
jQuery实现原理的模拟代码 -6 代码下载
Aug 16 Javascript
JSDoc 介绍使用规范JsDoc的使用介绍
Feb 12 Javascript
JavaScript保留两位小数的2个自定义函数
May 05 Javascript
JS函数重载的解决方案
May 13 Javascript
JS实现简单的图书馆享元模式实例
Jun 30 Javascript
JQuery日历插件My97DatePicker日期范围限制
Jan 20 Javascript
jquery.validate提示错误信息位置方法
Jan 22 Javascript
js实现div模拟模态对话框展现URL内容
May 27 Javascript
AngularJS下$http服务Post方法传递json参数的实例
Mar 29 Javascript
Intellij IDEA搭建vue-cli项目的方法步骤
Oct 20 Javascript
webpack 代码分离优化快速指北
May 18 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
桌面中心(一)创建数据库
2006/10/09 PHP
php基于闭包实现函数的自调用(递归)实例分析
2016/11/11 PHP
jquery 选择器部分整理
2009/10/28 Javascript
js常用代码段整理
2011/11/30 Javascript
js中判断数字\字母\中文的正则表达式 (实例)
2012/06/29 Javascript
jquery animate实现鼠标放上去显示离开隐藏效果
2013/07/21 Javascript
一个支持任意尺寸的图片上下左右滑动效果
2014/08/24 Javascript
JavaScript运行机制之事件循环(Event Loop)详解
2014/10/10 Javascript
bootstrap改变按钮加载状态
2014/12/01 Javascript
jQuery的css() 方法使用指南
2015/05/03 Javascript
javascript中去除数组重复元素的实现方法【实例】
2016/04/12 Javascript
JS hashMap实例详解
2016/05/26 Javascript
详解vue-cli + webpack 多页面实例应用
2017/04/25 Javascript
Angular.js中定时器循环的3种方法总结
2017/04/27 Javascript
原生JS实现层叠轮播图
2017/05/17 Javascript
Angular4学习笔记之准备和环境搭建项目
2017/08/01 Javascript
layui-laydate时间日历控件使用方法详解
2018/11/15 Javascript
layer.open组件获取弹出层页面变量、函数的实例
2019/09/25 Javascript
[02:44]DOTA2英雄基础教程 克林克兹
2014/01/15 DOTA
[02:12]Dota 2 推出全新英雄—— 电炎绝手
2019/08/23 DOTA
详解Python的Django框架中的通用视图
2015/05/04 Python
Python+django实现简单的文件上传
2016/08/17 Python
Python网络爬虫神器PyQuery的基本使用教程
2018/02/03 Python
解决pycharm下os.system执行命令返回有中文乱码的问题
2019/07/07 Python
树莓派4B+opencv4+python 打开摄像头的实现方法
2019/10/18 Python
python实现邮件循环自动发件功能
2020/09/11 Python
Python SQLAlchemy库的使用方法
2020/10/13 Python
HTML+CSS3模拟心的跳动实例代码
2017/09/05 HTML / CSS
详解Canvas事件绑定
2018/06/27 HTML / CSS
升职自荐信
2013/11/28 职场文书
超市营业员岗位职责
2013/12/20 职场文书
服务质量承诺书
2014/03/27 职场文书
文明班集体申报材料
2014/05/23 职场文书
2014年保险公司工作总结
2014/11/22 职场文书
Python中相见恨晚的技巧
2021/04/13 Python
Vue如何清空对象
2022/03/03 Vue.js