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 相关文章推荐
xmlHTTP实例
Oct 24 Javascript
Javascript判断对象是否相等实现代码
Mar 18 Javascript
js实现页面跳转重定向的几种方式
May 29 Javascript
关于JS中的方法是否加括号的问题
Jul 27 Javascript
Bootstrapvalidator校验、校验清除重置的实现代码(推荐)
Sep 28 Javascript
JS克隆,属性,数组,对象,函数实例分析
Nov 26 Javascript
基于Bootstrap分页的实例讲解(必看篇)
Jul 04 Javascript
bootstrap是什么_动力节点Java学院整理
Jul 14 Javascript
解决layui上传文件提示上传异常,实际文件已经上传成功的问题
Aug 19 Javascript
vue实现分页的三种效果
Jun 23 Javascript
简单了解前端渐进式框架VUE
Jul 20 Javascript
JavaScript实现队列结构过程
Dec 06 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
国内咖啡文化
2021/03/03 咖啡文化
用PHP书写安全的脚本代码
2012/02/05 PHP
php无限遍历文件夹示例分享
2014/03/04 PHP
Yii入门教程之Yii安装及hello world
2014/11/25 PHP
smarty模板引擎之分配数据类型
2015/03/30 PHP
php利用事务处理转账问题
2015/04/22 PHP
如何在标题栏显示框架内页面的标题
2007/02/03 Javascript
Jquery 动态生成表格示例代码
2013/12/24 Javascript
加随机数引入脚本不让浏览器读取缓存
2014/09/04 Javascript
jquery让指定的元素闪烁显示的方法
2015/03/17 Javascript
JS+DIV+CSS排版布局实现美观的选项卡效果
2015/10/10 Javascript
js基于cookie方式记住返回页面用法示例
2016/05/27 Javascript
js智能获取浏览器版本UA信息的方法
2016/08/08 Javascript
浅谈使用splice函数对数组中的元素进行删除时的注意事项
2016/12/04 Javascript
浅谈Node模块系统及其模式
2017/11/17 Javascript
react 创建单例组件的方法
2018/04/26 Javascript
Nodejs中怎么实现函数的串行执行
2019/03/02 NodeJs
Nodejs中的require函数的具体使用方法
2019/04/02 NodeJs
JS+html5实现异步上传图片显示上传文件进度条功能示例
2019/11/09 Javascript
vue 使用async写数字动态加载效果案例
2020/07/18 Javascript
关于Node.js中频繁修改代码重启服务器的问题
2020/10/15 Javascript
[53:21]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS LGD-CDEC
2014/05/22 DOTA
Python中逗号的三种作用实例分析
2015/06/08 Python
浅析Python基础-流程控制
2016/03/18 Python
Python实现Restful API的例子
2019/08/31 Python
如何使用 Python 读取文件和照片的创建日期
2020/09/05 Python
Python列表元素删除和remove()方法详解
2021/01/04 Python
LTD Commodities:礼品,独特发现,家居装饰,家用器皿
2017/08/11 全球购物
FORZIERI福喜利中国官网:奢侈品购物梦工厂
2019/05/03 全球购物
Solid & Striped官网:美国泳装品牌
2019/06/19 全球购物
英国著名药妆店:Superdrug
2021/02/13 全球购物
护士长竞聘演讲稿
2014/04/30 职场文书
乡镇领导干部个人对照检查材料思想汇报
2014/09/23 职场文书
西安兵马俑导游词
2015/02/02 职场文书
老乡聚会通知
2015/04/23 职场文书
Python 中的单分派泛函数你真的了解吗
2021/06/22 Python