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 相关文章推荐
JS如何将UTC格式时间转本地格式
Sep 04 Javascript
JavaScript判断前缀、后缀是否是空格的方法
Apr 15 Javascript
jQuery满屏焦点图左右滚动特效代码分享
Sep 07 Javascript
jquery实现表单验证简单实例演示
Nov 23 Javascript
AngularJS入门教程之路由与多视图详解
Aug 19 Javascript
jQuery包裹节点用法完整示例
Sep 13 Javascript
JS多文件上传的实例代码
Jan 11 Javascript
jQuery实现拼图小游戏(实例讲解)
Jul 24 jQuery
详解vue项目首页加载速度优化
Oct 18 Javascript
jQuery实现获取当前鼠标位置并输出功能示例
Jan 05 jQuery
Vue实现渲染数据后控制滚动条位置(推荐)
Dec 09 Javascript
vue点击按钮实现简单页面的切换
Sep 08 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 Zip压缩 在线对文件进行压缩的函数
2010/05/26 PHP
PHP的cURL库功能简介 抓取网页、POST数据及其他
2011/04/07 PHP
搭建基于Docker的PHP开发环境的详细教程
2015/07/01 PHP
实例简介PHP的一些高级面向对象编程的特性
2015/11/27 PHP
利用PHP如何写APP接口详解
2016/08/23 PHP
有关PHP 中 config.m4 的探索
2020/08/26 PHP
javascript eval函数深入认识
2009/02/21 Javascript
URL地址中的#符号使用说明
2011/02/12 Javascript
jquery控制显示服务器生成的图片流
2015/08/04 Javascript
jQuery Ajax页面局部加载方法汇总
2016/06/02 Javascript
Vue自定义指令介绍(2)
2016/12/08 Javascript
node中Express 动态设置端口的方法
2017/08/04 Javascript
浅谈vuex的基本用法和mapaction传值问题
2019/11/08 Javascript
js页面加载后执行的几种方式小结
2020/01/30 Javascript
JavaScript 链表定义与使用方法示例
2020/04/28 Javascript
[01:25]2014DOTA2国际邀请赛 zhou分析LGD比赛情况
2014/07/14 DOTA
python执行shell获取硬件参数写入mysql的方法
2014/12/29 Python
python正则表达式match和search用法实例
2015/03/26 Python
Python的Flask框架中使用Flask-Migrate扩展迁移数据库的教程
2016/06/14 Python
python中json格式数据输出的简单实现方法
2016/10/31 Python
CentOS 6.5下安装Python 3.5.2(与Python2并存)
2017/06/05 Python
Python实现树的先序、中序、后序排序算法示例
2017/06/23 Python
基于python实现名片管理系统
2018/11/30 Python
浅谈pycharm出现卡顿的解决方法
2018/12/03 Python
Python Tkinter 简单登录界面的实现
2019/06/14 Python
django使用xadmin的全局配置详解
2019/11/15 Python
Python和Sublime整合过程图示
2019/12/25 Python
美国隐形眼镜网:Major Lens
2018/02/09 全球购物
爱奇艺VIP会员:大剧抢先看
2018/07/11 全球购物
美国第一大药店连锁机构:Walgreens(沃尔格林)
2019/10/10 全球购物
教师一岗双责责任书
2014/04/16 职场文书
2015年英语教师工作总结
2015/05/20 职场文书
vue-cropper插件实现图片截取上传组件封装
2021/05/27 Vue.js
Jupyter Notebook内使用argparse报错的解决方案
2021/06/03 Python
Python实现查询剪贴板自动匹配信息的思路详解
2021/07/09 Python
idea下配置tomcat避坑详解
2022/04/12 Servers