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 相关文章推荐
PHP中CURL的几个经典应用实例
Jan 23 Javascript
javascript实现字符串反转的方法
Feb 05 Javascript
javascript委托(Delegate)blur和focus用法实例分析
May 26 Javascript
js实现二级菜单渐隐显示
Nov 03 Javascript
JSON 的正确用法探讨:Pyhong、MongoDB、JavaScript与Ajax
May 15 Javascript
关于Vue.js一些问题和思考学习笔记(2)
Dec 02 Javascript
详解JavaScript时间处理之几个月前或几个月后的指定日期
Dec 21 Javascript
vue.js轮播图组件使用方法详解
Jul 03 Javascript
如何实现双向绑定mvvm的原理实现
May 28 Javascript
微信小程序通过js实现瀑布流布局详解
Aug 28 Javascript
JavaScript实现简单的弹窗效果
May 19 Javascript
Vue在H5 项目中使用融云进行实时个人单聊通讯
Dec 14 Vue.js
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
其他功能
2006/10/09 PHP
PHP setcookie指定domain参数后,在IE下设置cookie失效的解决方法
2011/09/09 PHP
深入array multisort排序原理的详解
2013/06/18 PHP
PHP扩展框架之Yaf框架的安装与使用
2016/05/18 PHP
PHP对象的浅复制与深复制的实例详解
2017/10/26 PHP
PHP调用微博接口实现微博登录的方法示例
2018/09/22 PHP
JavaScript高级程序设计 客户端存储学习笔记
2011/09/10 Javascript
Prototype源码浅析 Number部分
2012/01/16 Javascript
uploadify在Firefox下丢失session问题的解决方法
2013/08/07 Javascript
jquery中focus()函数实现当对象获得焦点后自动把光标移到内容最后
2013/09/29 Javascript
jsonp原理及使用
2013/10/28 Javascript
js 操作符汇总
2014/11/08 Javascript
angularJS 指令封装回到顶部示例详解
2017/01/22 Javascript
scrapyd schedule.json setting 传入多个值问题
2019/08/07 Javascript
微信小程序实现注册登录功能(表单校验、错误提示)
2019/12/10 Javascript
简单介绍Python中的几种数据类型
2016/01/02 Python
Python实现的redis分布式锁功能示例
2018/05/29 Python
对python自动生成接口测试的示例讲解
2018/11/30 Python
PyQt+socket实现远程操作服务器的方法示例
2019/08/22 Python
Python队列、进程间通信、线程案例
2019/10/25 Python
详解pandas绘制矩阵散点图(scatter_matrix)的方法
2020/04/23 Python
Pycharm打开已有项目配置python环境的方法
2020/07/03 Python
简单了解Django项目应用创建过程
2020/07/06 Python
python 深度学习中的4种激活函数
2020/09/18 Python
OPPO手机官方商城:中国手机市场出货量第一品牌
2017/10/18 全球购物
ghd法国官方网站:英国最受欢迎的美发工具品牌
2019/04/18 全球购物
德国2018年度最佳在线药房:Bodfeld Apotheke
2019/11/04 全球购物
商务英语毕业生自荐信范文
2013/11/08 职场文书
售前工程师职业生涯规划
2014/03/02 职场文书
灰雀教学反思
2014/04/28 职场文书
大学辅导员述职报告
2015/01/10 职场文书
2015年推广普通话演讲稿
2015/03/20 职场文书
培训通知书模板
2015/04/17 职场文书
教师节简报
2015/07/20 职场文书
《工作是最好的修行》读后感3篇
2019/12/13 职场文书
详解Flutter网络请求Dio库的使用及封装
2022/04/14 Java/Android