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 相关文章推荐
javascript不同页面传值的改进版
Sep 30 Javascript
把jquery 的dialog和ztree结合实现步骤
Aug 02 Javascript
JS、DOM和JQuery之间的关系示例分析
Apr 09 Javascript
JavaScript 事件对象介绍
Apr 13 Javascript
jQuery实现平滑滚动的标签分栏切换效果
Aug 28 Javascript
全面了解构造函数继承关键apply call
Jul 26 Javascript
解决前端跨域问题方案汇总
Nov 20 Javascript
ajax级联菜单实现方法实例分析
Nov 28 Javascript
vue2手机APP项目添加开屏广告或者闪屏广告
Nov 28 Javascript
解决angularjs前后端分离调用接口传递中文时中文乱码的问题
Aug 13 Javascript
微信小程序onLaunch异步,首页onLoad先执行?
Sep 20 Javascript
Vue 数据响应式相关总结
Jan 28 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
关于URL最大长度限制的相关资料查证
2014/12/23 PHP
php抽象方法和普通方法的区别点总结
2019/10/13 PHP
js 方法实现返回多个数据的代码
2009/04/30 Javascript
jquery中的sortable排序之后的保存状态的解决方法
2010/01/28 Javascript
jquery下json数组的操作实现代码
2010/08/09 Javascript
c#和Javascript操作同一json对象的实现代码
2012/01/17 Javascript
JavaScript对象创建及继承原理实例解剖
2013/02/28 Javascript
JavaScript数组常用方法
2015/03/02 Javascript
js模仿php中strtotime()与date()函数实现方法
2015/08/11 Javascript
提升jQuery的性能需要做好七件事
2016/01/11 Javascript
Javascript实现鼠标框选操作  不是点击选取
2016/04/14 Javascript
Bootstrap每天必学之响应式导航、轮播图
2016/04/25 Javascript
jQuery模仿单选按钮选中效果
2016/06/24 Javascript
Bootstrap 网格系统布局详解
2017/03/19 Javascript
vue2.0的contextmenu右键弹出菜单的实例代码
2017/07/24 Javascript
vue ssr 指南详读
2018/06/29 Javascript
解决Layui中templet中a的onclick参数传递的问题
2019/09/20 Javascript
用C++封装MySQL的API的教程
2015/05/06 Python
Python基础学习之常见的内建函数整理
2017/09/06 Python
Python AES加密实例解析
2018/01/18 Python
Python拼接微信好友头像大图的实现方法
2018/08/01 Python
python实现最大子序和(分治+动态规划)
2019/07/05 Python
Python使用cn2an实现中文数字与阿拉伯数字的相互转换
2021/03/02 Python
绝对令人的惊叹的CSS3折叠效果(3D效果)整理
2012/12/30 HTML / CSS
HTML5页面直接调用百度地图API获取当前位置直接导航目的地的实现代码
2018/03/02 HTML / CSS
捷克厨房用品购物网站:Tescoma
2018/07/13 全球购物
英国最大的户外商店:Go Outdoors
2019/04/17 全球购物
Lookfantastic意大利官网:英国知名美妆购物网站
2019/05/31 全球购物
金智子午JAVA面试题
2015/09/04 面试题
《蒙娜丽莎之约》教学反思
2014/02/27 职场文书
团委竞选演讲稿
2014/04/24 职场文书
项目申报专员岗位职责
2014/07/09 职场文书
2015年客房服务员工作总结
2015/05/15 职场文书
小学一年级班主任工作经验交流材料
2015/11/02 职场文书
浅谈react useEffect闭包的坑
2021/06/08 Javascript
vue实现省市区联动 element-china-area-data插件
2022/04/22 Vue.js