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之一(对象的组成)
Jun 11 Javascript
jQuery下通过replace字符串替换实现大小图片切换
May 22 Javascript
javascript学习笔记(一) 在html中使用javascript
Jun 18 Javascript
JS注释所产生的bug 即使注释也会执行
Nov 19 Javascript
在JS数组特定索引处指定位置插入元素
Jul 27 Javascript
一道优雅面试题分析js中fn()和return fn()的区别
Jul 05 Javascript
js通过classname来获取元素的方法
Nov 24 Javascript
JS作用域闭包、预解释和this关键字综合实例解析
Dec 16 Javascript
详解Vue中使用Echarts的两种方式
Jul 03 Javascript
JS中使用cavas截图网页并解决跨域及模糊问题
Nov 13 Javascript
详解微信小程序回到顶部的两种方式
May 09 Javascript
在HTML5 localStorage中存储对象的示例代码
Apr 21 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制作图形验证码代码分享
2014/10/23 PHP
简单概括PHP的字符串中单引号与双引号的区别
2016/05/07 PHP
PHP开发实现微信退款功能示例
2017/11/25 PHP
PHP多个图片压缩成ZIP的方法
2020/08/18 PHP
thinkphp5+layui实现的分页样式示例
2019/10/08 PHP
jquery 缓存问题的几个解决方法
2013/11/11 Javascript
做好七件事帮你提升jQuery的性能
2014/02/06 Javascript
js获取上传文件大小示例代码
2014/04/10 Javascript
JavaScript截取字符串的2个函数介绍
2014/08/27 Javascript
Javascript中arguments和arguments.callee的区别浅析
2015/04/24 Javascript
vue 将页面公用的头部组件化的方法
2017/12/18 Javascript
vue.js element-ui tree树形控件改iview的方法
2018/03/29 Javascript
详解react、redux、react-redux之间的关系
2018/04/11 Javascript
JS打印彩色菱形的实例代码
2018/08/15 Javascript
vuex实现的简单购物车功能示例
2019/02/13 Javascript
JS中的函数与对象的创建方式
2019/05/12 Javascript
vue实现移动端图片上传功能
2019/12/23 Javascript
在Vue中实现随hash改变响应菜单高亮
2020/03/09 Javascript
Node.js 深度调试方法解析
2020/07/28 Javascript
Vant+postcss-pxtorem 实现浏览器适配功能
2021/02/05 Javascript
在Python中使用next()方法操作文件的教程
2015/05/24 Python
横向对比分析Python解析XML的四种方式
2016/03/30 Python
Python整数对象实现原理详解
2019/07/01 Python
Python3 执行Linux Bash命令的方法
2019/07/12 Python
Django如何使用第三方服务发送电子邮件
2019/08/14 Python
Python代码注释规范代码实例解析
2020/08/14 Python
CSS3的颜色渐变效果的示例代码
2017/09/29 HTML / CSS
美国领先的低折扣旅行网站:Hotwire
2019/01/19 全球购物
大学生简历的个人自我评价
2013/12/04 职场文书
前处理组长岗位职责
2014/03/01 职场文书
给校长的建议书500字
2014/05/15 职场文书
爱的奉献演讲稿
2014/09/10 职场文书
公司离职证明范本(5篇)
2014/09/17 职场文书
小学运动会通讯稿
2015/07/18 职场文书
Nginx虚拟主机的搭建的实现步骤
2022/01/18 Servers
【海涛DOTA】D-cup邀请赛NV.cn vs DT.Love
2022/04/01 DOTA