Vue递归实现树形菜单方法实例


Posted in Javascript onNovember 06, 2018

什么是树形菜单还是要简单的??乱幌拢?热纾?/p>

Vue递归实现树形菜单方法实例

上图是截图自elementui的实例,实现方式是用文档结构(类似像原生Dom文档结构的写法)的方式,好处就是很灵活,可以方便的自定义,作为一个通用视图组件库这是正确的做法。

在实际的企业应用中,菜单要比这复杂很多,层次也要多很多,如果我们采取手动编写文档结构的方式,会导致代码亢长,阅读和维护都很低效。毫无疑问所有Vuer都会想到用一个数据结构来驱动文档结构。vue-router的数据结构恰恰就是完美的嵌套层次结构(树结构),同时vue文档中也提到了递归组件,基于这两点,我们来撸码,不过这次有所不同,我们选择使用render函数来实现,而不是在模板中递归。

数据结构:vue-router的数据结构

const routes = [
 {
 name: 'home',
 path: '/home',
 meta: { text: '首页' }
 },
 {
 name: 'inner',
 path: '/inner',
 meta: { text: '内部平台' },
 children: [
  {
  name: 'oa',
  path: 'oa',
  meta: { text: 'OA' }
  },
  {
  name: 'jira',
  path: 'jira',
  meta: { text: 'Jira' }
  },
  {
  name: 'wiki',
  path: 'wiki',
  meta: { text: 'Wiki' }
  },
  {
  name: 'caiwu',
  path: 'caiwu',
  meta: { text: '财务' },
  children: [
   {
   name: 'chailv',
   path: 'chailv',
   meta: { text: '差旅' }
   },
   {
   name: 'richang',
   path: 'richang',
   meta: { text: '日常' },
   children: [
    {
    name: 'taxi',
    path: 'taxi',
    meta: { text: '交通' }
    },
    {
    name: 'tel',
    path: 'tel',
    meta: { text: '通信' }
    }
   ]
   }
  ]
  }
 ]
 },
 {
 name: 'sec',
 path: '/sec',
 meta: { text: '审核' },
 children: [
  {
  name: 'acl',
  path: '/acl',
  meta: { text: 'ACL' }
  }
 ]
 }
]

组件实现:

先看看render函数,其中包含一个递归函数elements:

render (r) {
 return r(
  'el-menu',
  {
  props: {
   backgroundColor: "#545c64",
   textColor: "#fff",
   activeTextColor: "#ffd04b"
  },
  on: {
   select: this.onSelect
  }
  },
  this.elements(this.routes, r)
 )
 }

elements函数:

elements (routes, r) {
  return routes
  .map(route => {
   if (!route.paths) route.paths = []
   if (route.children && route.children.length) {
   return r(
    'el-submenu',
    {
    props: {
     index: route.name
    }
    },
    [
    r(
     'span',
     {
     slot: 'title'
     },
     [
     route.meta.text
     ]
    ),
    this.elements(route.children, r)
    ]
   )
   } else if (route.path) {
   return r(
    'el-menu-item',
    {
    props: {
     index: route.name
    }
    },
    [
    route.meta.text
    ]
   )
   } else {
   return null
   }
  })
  .filter(item => item)
 }

最终效果:

Vue递归实现树形菜单方法实例

完整代码示例请戳:https://codepen.io/360vislab/pen/GQqBve

总结:

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
javaScript(JS)替换节点实现思路介绍
Apr 17 Javascript
基于JQuery 滑动与动画的说明介绍
Apr 18 Javascript
js实现的切换面板实例代码
Jun 17 Javascript
JQuery文字列表向上滚动的代码
Nov 13 Javascript
jquery表单验证框架提供的身份证验证方法(示例代码)
Dec 27 Javascript
分享一个常用的javascript静态类
Dec 31 Javascript
JavaScript实现表格快速变色效果代码
Aug 19 Javascript
JavaScript学习小结(7)之JS RegExp
Nov 29 Javascript
AngularJS中run方法的巧妙运用
Jan 04 Javascript
Angularjs 依赖压缩及自定义过滤器写法
Feb 04 Javascript
简单谈谈vue的过渡动画(推荐)
Oct 11 Javascript
前端开发之便利店收银系统代码
Dec 27 Javascript
electron中使用bootstrap的示例代码
Nov 06 #Javascript
vue实现自定义日期组件功能的实例代码
Nov 06 #Javascript
浅谈Vue数据响应思路之数组
Nov 06 #Javascript
Vue项目中最新用到的一些实用小技巧
Nov 06 #Javascript
详解Vue内部怎样处理props选项的多种写法
Nov 06 #Javascript
微信小程序实现选项卡效果
Nov 06 #Javascript
Vue props 单向数据流的实现
Nov 06 #Javascript
You might like
JAVA/JSP学习系列之四
2006/10/09 PHP
PHP中MVC模式的模板引擎开发经验分享
2011/03/23 PHP
php记录代码执行时间(实现代码)
2013/07/05 PHP
php中socket的用法详解
2014/10/24 PHP
php中的常用魔术方法汇总
2016/02/14 PHP
TNC vs BOOM BO3 第二场2.13
2021/03/10 DOTA
js资料toString 方法
2007/03/13 Javascript
javascript中常用编程知识
2013/04/08 Javascript
jQuery实现返回顶部功能适合不支持js的浏览器
2014/08/19 Javascript
JavaScript分秒倒计时器实现方法
2015/02/02 Javascript
javascript组合使用构造函数模式和原型模式实例
2015/06/04 Javascript
jquery实现的3D旋转木马特效代码分享
2015/08/25 Javascript
详解JavaScript中this关键字的用法
2016/05/26 Javascript
轮播图组件js代码
2016/08/08 Javascript
基于layer.js实现收货地址弹框选择然后返回相应的地址信息
2017/05/26 Javascript
JavaScript设计模式之策略模式详解
2017/06/09 Javascript
ES6 javascript的异步操作实例详解
2017/10/30 Javascript
web.py获取上传文件名的正确方法
2014/08/26 Python
使用Python的Scrapy框架编写web爬虫的简单示例
2015/04/17 Python
Python+Socket实现基于TCP协议的客户与服务端中文自动回复聊天功能示例
2017/08/31 Python
Python中property属性实例解析
2018/02/10 Python
python 处理dataframe中的时间字段方法
2018/04/10 Python
Python文件监听工具pyinotify与watchdog实例
2018/10/15 Python
python集成开发环境配置(pycharm)
2020/02/14 Python
在Django中自定义filter并在template中的使用详解
2020/05/19 Python
如何基于matlab相机标定导出xml文件
2020/11/02 Python
Python3使用tesserocr识别字母数字验证码的实现
2021/01/29 Python
Python爬虫爬取微博热搜保存为 Markdown 文件的源码
2021/02/22 Python
用HTML5制作视频拼图的教程
2015/05/13 HTML / CSS
世界上最好的足球商店:Unisport
2019/03/02 全球购物
Moda Operandi官网:美国奢侈品电商,海淘秀场T台同款
2020/05/26 全球购物
三好学生个人先进事迹材料
2014/05/17 职场文书
2015年社区民政工作总结
2015/04/21 职场文书
开业典礼致辞
2015/07/29 职场文书
职工培训工作总结
2015/08/10 职场文书
数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,UNION关键字,连接中ON与WHERE的不同)
2021/04/05 MySQL