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 1.5 源码解读 面向中高阶JSER
Apr 05 Javascript
JavaScript window.document的属性、方法和事件小结
Oct 24 Javascript
让html页面不缓存js的实现方法
Oct 31 Javascript
使用jQuery不判断浏览器高度解决iframe自适应高度问题
Dec 16 Javascript
JSON与XML优缺点对比分析
Jul 17 Javascript
js淡入淡出的图片轮播效果代码分享
Aug 24 Javascript
灵活的理解JavaScript中的this指向
Feb 25 Javascript
JavaScript实现三级联动菜单效果
Aug 16 Javascript
深入解析Vue源码实例挂载与编译流程实现思路详解
May 05 Javascript
js回文数的4种判断方法示例
Jun 04 Javascript
Openlayers实现图形绘制
Sep 28 Javascript
二维码条形码生成的JavaScript脚本库
Jul 07 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
不用数据库的多用户文件自由上传投票系统(2)
2006/10/09 PHP
php使用ob_flush不能每隔一秒输出原理分析
2015/06/02 PHP
php单例模式的简单实现方法
2016/06/10 PHP
phalcon model在插入或更新时会自动验证非空字段的解决办法
2016/12/29 PHP
phpStudy 2016 使用教程详解(支持PHP7)
2017/10/18 PHP
PHP多线程模拟实现秒杀抢单
2018/02/07 PHP
PHP+ajax实现获取新闻数据简单示例
2018/05/08 PHP
解析John Resig Simple JavaScript Inheritance代码
2012/12/03 Javascript
js获得参数的getParameter使用示例
2014/02/26 Javascript
Jquery Ajax方法传值到action的方法
2014/05/11 Javascript
JavaScript也谈内存优化
2014/06/06 Javascript
JS自定义对象实现Java中Map对象功能的方法
2015/01/20 Javascript
如何改进javascript代码的性能
2015/04/02 Javascript
jQuery实现类似淘宝网图片放大效果的方法
2015/07/08 Javascript
8 行 Node.js 代码实现代理服务器
2016/12/05 Javascript
jQuery实现Select下拉列表进行状态选择功能
2017/03/30 jQuery
利用CDN加速react webpack打包后的文件详解
2018/02/22 Javascript
详解React项目的服务端渲染改造(koa2+webpack3.11)
2018/03/19 Javascript
微信小程序自定义单项选择器样式
2019/07/25 Javascript
JS画布动态实现黑客帝国背景效果
2020/11/08 Javascript
echarts柱状图背景重叠组合而非并列的实现代码
2020/12/10 Javascript
[00:20]TI9观赛名额抽取Ⅱ
2019/07/24 DOTA
[05:49]DOTA2-DPC中国联赛 正赛 Elephant vs LBZS 选手采访
2021/03/11 DOTA
Python查询Mysql时返回字典结构的代码
2012/06/18 Python
9种python web 程序的部署方式小结
2014/06/30 Python
python ipset管理 增删白名单的方法
2019/01/14 Python
Windows 下python3.8环境安装教程图文详解
2020/03/11 Python
Python获取指定网段正在使用的IP
2020/12/14 Python
用pip给python安装matplotlib库的详细教程
2021/02/24 Python
2014年客房服务员工作总结
2014/11/18 职场文书
2015年师德表现自我评价
2015/03/05 职场文书
元旦主持词开场白
2015/05/29 职场文书
幼儿园家长反馈意见
2015/06/03 职场文书
导游词之潮音寺
2019/09/26 职场文书
详解thinkphp的Auth类认证
2021/05/28 PHP
详解pytorch创建tensor函数
2022/03/22 Python