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 相关文章推荐
jquery 为a标签绑定click事件示例代码
Jun 23 Javascript
jquery 实现两Select 标签项互调示例代码
Sep 25 Javascript
JS实现从连接中获取youtube的key实例
Jul 02 Javascript
JS实现带提示的星级评分效果完整实例
Oct 30 Javascript
Jquery跨浏览器文本复制插件Zero Clipboard的使用方法
Feb 28 Javascript
javascript中对Date类型的常用操作小结
May 19 Javascript
JavaScript闭包实例详解
Jun 03 Javascript
AngularJS基于ngInfiniteScroll实现下拉滚动加载的方法
Dec 14 Javascript
js 数据存储和DOM编程
Feb 09 Javascript
基于AGS JS开发自定义贴图图层
Mar 31 Javascript
JS简单实现点击跳转登陆邮箱功能的方法
Oct 31 Javascript
详解@angular/cli 改变默认启动端口两种方式
Nov 29 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
php XPath对XML文件查找及修改实现代码
2011/07/27 PHP
php_screw 1.5:php加密: 安装与使用详解
2013/06/20 PHP
php实现图片缩放功能类
2013/12/18 PHP
php解决和避免form表单重复提交的几种方法
2016/08/31 PHP
利用PHP计算有多少小于当前数字的数字方法示例
2020/08/26 PHP
JS类库Bindows1.3中的内存释放方式分析
2007/03/08 Javascript
一个简单的javascript类定义例子
2009/09/12 Javascript
仅IE9/10同时支持script元素的onload和onreadystatechange事件分析
2011/04/27 Javascript
两种方法实现在HTML页面加载完毕后运行某个js
2014/06/16 Javascript
js实现checkbox全选、不选与反选的方法
2015/02/09 Javascript
jQuery实现的动态伸缩导航菜单实例
2015/05/07 Javascript
jquery实现的伪分页效果代码
2015/10/29 Javascript
jQuery选择器用法实例详解
2015/12/17 Javascript
微信小程序 form组件详解及简单实例
2017/01/10 Javascript
JavaScript 完成注册页面表单校验的实例
2017/08/19 Javascript
vue仿淘宝订单状态的tab切换效果
2020/06/23 Javascript
vue2实现可复用的轮播图carousel组件详解
2017/11/27 Javascript
JavaScript笛卡尔积超简单实现算法示例
2018/07/30 Javascript
vue debug 二种方法
2018/09/16 Javascript
echarts多条折线图动态分层的实现方法
2019/05/24 Javascript
微信小程序聊天功能的示例代码
2020/01/13 Javascript
python实现unicode转中文及转换默认编码的方法
2017/04/29 Python
对Python之gzip文件读写的方法详解
2019/02/08 Python
使用matplotlib绘制图例标签中带有公式的图
2019/12/13 Python
python pymysql链接数据库查询结果转为Dataframe实例
2020/06/05 Python
CSS实现限制字数功能当对象内文本溢出时显示省略标记
2014/08/20 HTML / CSS
一封普通求职者的求职信
2013/11/20 职场文书
运动会开幕式邀请函
2014/02/03 职场文书
教师见习期自我鉴定
2014/04/28 职场文书
公共场所标语
2014/06/30 职场文书
2014年图书馆个人工作总结
2014/12/18 职场文书
2015年八一建军节活动总结
2015/03/20 职场文书
网站文案策划岗位职责
2015/04/14 职场文书
遗嘱格式范本
2015/08/07 职场文书
2019年励志签名:致拼搏路上的自己
2019/10/11 职场文书
Opencv实现二维直方图的计算及绘制
2021/07/21 Python