树形菜单是开发后台管理系统都绕不过的一个需求,也是各种UI框架都必须具备的组件。实际开发中,大多数时候都是直接拿别人的轮子过来用,但作为一个有追求的程序猿怎么能不知道轮子背后的东西呢?今天,我就基于Vue用两种方式来实现树形菜单。

准备工作

Vue开发环境

父组件.png

树形结构的数据

data: [

{

name: 'home',

path: '/home',

isExpand: false,

meta: { text: '首页' }

},

{

name: 'manage',

path: '/manage',

isExpand: false,

meta: {text: '系统管理'},

children: [

{

name: 'staff',

path: 'staff',

isExpand: false,

meta: {text: '员工管理'}

},

{

name: 'role',

path: 'role',

isExpand: false,

meta: {text: '角色管理'}

},

{

name: 'auth',

path: 'auth',

isExpand: false,

meta: {text: '权限管理'}

},

{

name: 'daily',

path: 'daily',

isExpand: false,

meta: {text: '日常管理'},

children: [

{

name: 'attendance',

path: 'attendance',

isExpand: false,

meta: {text: '考勤管理'},

},

{

name: 'performance',

path: 'performance',

isExpand: false,

meta: {text: '绩效管理'}

}

]

}

]

},

{

name: 'finance',

path: '/finance',

isExpand: false,

meta: {text: '财务管理'},

children: [

{

name: 'income',

path: 'income',

isExpand: false,

meta: {text: '收入管理'},

},

{

name: 'expense',

path: 'expense',

isExpand: false,

meta: {text: '支出管理'},

}

]

}

]

两种实现

1、递归组件

// 子组件

  • @click="handleClick(item)">{{item.meta.text}}

export default {

name: 'TreeOne',

props: {

treeData: {

type: Array,

default: () => {

return []

}

}

},

methods: {

handleClick(){}

}

}

2、render函数

// 子组件

import img1 from '../assets/img/icon_arrow_right.png'

import img2 from '../assets/img/icon_arrow_down.png'

export default {

name: 'TreeTwo',

props: {

treeData: {

type: Array,

default: () => {

return []

}

}

},

render(r){

return this.elements(this.treeData,r)

},

methods: {

elements(data,r){

return r('ul',[

data.map(item => {

if (item.children && item.children.length > 0) {

return r('li',{

'class': {

active: !(item.children && item.children.length > 0)

}

},[

r('span',{

'class':'item'

},[

r('span',{

'class': 'icon',

on:{

click: () => {

item.isExpand = !item.isExpand

}

}

},[

r('img',{

attrs: {

src: item.children && item.children.length > 0 && !item.isExpand ?

img1 : (item.children && item.children.length > 0 && item.isExpand ? img2 : '')

}

})

]),

r('span',{

'class': 'title',

on: {

click: () => {

}

}

},item.meta.text,)

]),

// 递归调用

item.isExpand ? this.elements(item.children,r): null

])

} else {

return r('li',item.meta.text)

}

})

])

}

}

}

实现效果

效果.png

以上就是用两种方式实现的树组件,重点在于递归的思想,希望对读者有所帮助。详情可以查看源代码:源码

vue树形权限菜单_基于Vue的树形菜单之两种方式实现相关推荐

  1. vue 在线编辑excel表格(原生和使用组件的两种方式)

    vue 在线编辑excel表格(原生和使用组件的两种方式) top表头和left表头格式的表格 <template><div><!-- 用组件写的编辑表格 -->& ...

  2. python钉钉扫码登录程序_钉钉扫码登录网站(两种方式实现)

    钉钉扫码登录网站(两种方式实现) 效果: 动手敲代码! 第一步,钉钉后台配置 点击进入钉钉开发者平台 的页面,点击左侧菜单的[移动接入应用-登录],然后点击右上角的[创建扫码登录应用授权],创建用于免 ...

  3. 基于Netty手工实现springMVC框架-----两种方式加载控制器

    1.手写springMVC框架 本篇我们通过两种方式来加载控制器,一种是配置文件的方式:另外一种是通过注解的形式. 1.配置文件方式 1.自定义Controller配置文件XML 我定义的格式如下: ...

  4. vue划入划出事件_基于vue中对鼠标划过事件的处理方式详解

    鼠标事件进行监听 需求中,在一个table(组件)表中,对于其中一列(该列为图片列),当鼠标划过该列的某个单元格子(图片)时,需要展示出该单元格子对应的遮罩层 翻阅了一些博客,发现好多都提到了mous ...

  5. 基于vue前端聊天插件_基于Vue聊天的实现

    基于vue前端聊天插件 基本视频聊天 (basic-vue-chat) Easy to use VueJS chat. 易于使用的VueJS聊天. 安装 (Installation) You can ...

  6. vue时间天气插件_基于vue.js 2.0的百度天气应用 – vue-weather

    vue-weather 基于vue.js 2.0的百度天气应用. 说明 初学vue,在看完一个简单的视频教程和走两遍完官方文档之后仍然感觉云里雾里,知其然不知其所以然(虽然现在好了点).请教了高手之后 ...

  7. vue连线 插件_基于Vue的任务节点图绘制插件(vue-task-node)

    简介: vue-task-node 是一个基于Vue的任务节点图绘制插件(vue-task-node is a Vue based task node mapping plug-in) 此篇博客会随插 ...

  8. VUE实现点击头像出现遮罩层的功能的两种方式

    本文是为了解决点击头像,出现一个遮罩层,显示上传头像.先说一下思路,第一种是用动画的方式来移动位置,但是ie9不支持动画,ie8一下直接不支持位置移动.所以某就研究了第二种方式,就是利用相对位置的固定 ...

  9. vue.js动态计时器_基于Vue.js的Pomodoro技术计时器

    vue.js动态计时器 番茄 (pomodoro) Timer for Pomodoro Technique built on Vue.js 2.0 with PWA 基于PWA的Vue.js 2.0 ...

  10. vue连线 插件_基于vue的网页标尺辅助线工具(vue-ruler-tool)

    原文首发于我的博客,欢迎点击查看获得更好的阅读体验~ 标尺辅助线.gif vue-ruler-tool 最近在网上找到一个网页制作辅助工具-jQuery标尺参考线插件,觉得在现在的一个项目中能用的上, ...

最新文章

  1. Centos6.5安装python2.7与pip
  2. 区块链BaaS云服务(21)腾讯CCGP”节点安全“
  3. 使用cloudera manager安装Oozie服务【详细步骤】
  4. android 动态设置View的高度和宽度,ViewTreeObserver使用
  5. 借助钉钉宜搭,奶茶店开始用黑科技管理门店了
  6. creator图片循环显示_Cocos creator 游戏背景循环滚动--Javascript编写
  7. LAMP(CentOS 7.2)环境下搭建WordPress
  8. Canvas.Top和Canvas.Left属性
  9. SAP 下载EXCEL模板
  10. “中国互联网100强”(2013)发布
  11. java截取视频第一帧图片
  12. python+Flask 返回视频并在前端播放
  13. 机器学习与深度学习常见面试题
  14. suitecrm上传附件限制修改
  15. Win10 下搭建PHP开发环境(自定义方式)
  16. java 单线程 并发_单线程_Java高并发专题系列_Java视频-51CTO学院
  17. 面试可能遇到java基础知识
  18. 互联网赚钱的逻辑是什么?
  19. 到底cms企业建站系统是什么?为什么要做cms系统?
  20. android qq隐藏功能,90﹪的人都不知道--手机QQ这些隐藏的功能!

热门文章

  1. 简易2D横版RPG游戏制作
  2. vue中引入高德地图并多点标注
  3. linux下的qt没有qpixma类吗,Qt基础教程之QTreeWidget和QDockWidget用法详解
  4. 魔方cfop公式软件_易烊千玺弟弟7岁破魔方世界纪录,记忆力和毅力惊人
  5. 什么是API接口?给大家举例说明
  6. linux 进程 cmd su,linux下常用管理命令
  7. 从数据库得到数据导出指定格式的xml文件,上传到NC接口,返回回执到本地一个xml文件
  8. 百度地图高德地图谷歌地图腾讯地图商家数据采集
  9. 自愈的三把钥匙:接受,改变,离开
  10. Preact 在TSX中优雅使用className