vuejs实现递归树型菜单组件


Posted in Javascript onJanuary 13, 2018

前言

前段时间使用vue做了一套后台管理系统,其中使用最多就是递归组件,也因为自己对官方文档的不熟悉使得自己踩了不少坑,今天写出来和大家一起分享。

递归组件

组件在它的模板内可以递归地调用自己,只有当它有 name 选项时才可以。 在官网这句话就是关键定义组件是一定要有name属性。

模拟数据格式如下:

[
  {
   "id": "1",
   "menuName": "基础管理",
   "menuCode": "10",
   "children": [
    {
     "menuName": "用户管理",
     "menuCode": "11"
    },
    {
     "menuName": "角色管理",
     "menuCode": "12",
     "children": [
      {
       "menuName": "管理员",
       "menuCode": "121"
      },
      {
       "menuName": "CEO",
       "menuCode": "122"
      },
      {
       "menuName": "CFO",
       "menuCode": "123"
      },
      {
       "menuName": "COO",
       "menuCode": "124"
      },
      {
       "menuName": "普通人",
       "menuCode": "124"
      }
     ]
    },
    {
     "menuName": "权限管理",
     "menuCode": "13"
    }
   ]
  },
  {
   "id": "2",
   "menuName": "商品管理",
   "menuCode": ""
  },
  {
   "id": "3",
   "menuName": "订单管理",
   "menuCode": "30",
   "children": [
    {
     "menuName": "订单列表",
     "menuCode": "31"
    },
    {
     "menuName": "退货列表",
     "menuCode": "32",
     "children": []
    }
   ]
  },
  {
   "id": "4",
   "menuName": "商家管理",
   "menuCode": "",
   "children": []
  }
 ]

html我们思路按照ul里面套li,无限ul套li,标题用div元素包裹,

<template>
 <li>
  <span @click="toggle">   <!-- toggle:点击关闭展开 -->
   <i v-if="isFolder" class="icon" :class="[open ? 'folder-open' : 'folder']" @cilck="toggle"></i>
   <!-- <i v-if="isFolder" class="icon " :class="[open ? 'folder-open' : 'folder']"></i> -->
   <i v-if="!isFolder" class="icon folder-text"></i>
   {{model.menuName}}
  </span>
  <ul v-show="open" v-if="isFolder">
   <treeMenu v-for="item in model.children" :model="item"></treeMenu>
  </ul>
 </li>
</template>

官方文档里面写的递归组件强调了使用name属性

需要注意的是,由父组件传递过来的数据要先进行深拷贝哦

深拷贝:把props赋值到data里,赋值的同时深拷贝一下,data里 JSON.parse(JSON.stringify(这个值就行了)),data值自己命名

export default {
  name: 'treeMenu',
  //props: ['model'], //这样和下面效果一样
  props: {
   model: { type: Object },
  },
  components: {},
}

按照vue的思想,不操作Dom树,我们定义两个变量,一个显示隐藏子菜单(open),一个存不存子菜单修改图标(isFolder)。

data() {
   return {
    open: false, //一个显示隐藏子菜单(open)
    //isFolder: true  //这个不要写死,运用计算属性计算看存不存在
   }
  },

利用vue计算属性动态改变isFolder的值,修改图标,判断存在不子级和子级长度

computed: {
   isFolder() { //利用vue计算属性动态改变isFolder的值,修改图标,判断存在不子级和子级长度
    // return this.model.children && this.model.children.length //和下面效果一样
    let isFolder = false
    if (this.model.children && this.model.children.length) {
     isFolder = true;
    } else {
     isFolder = false;
    }
    return isFolder
   }
  },

显示隐藏事件

methods: {
   toggle() {
    if (this.isFolder) {
     this.open = !this.open
    }
   }
  },

写到这里我们已经做完一个树形菜单了

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript继承之为什么要继承
Nov 10 Javascript
jQuery+.net实现浏览更多内容(改编php版本)
Mar 28 Javascript
javascript定义变量时带var与不带var的区别分析
Jan 12 Javascript
JavaScript动态加载样式表的方法
Mar 21 Javascript
JavaScript用select实现日期控件
Jul 17 Javascript
Three.js快速入门教程
Sep 09 Javascript
jQuery ajaxForm()的应用
Oct 14 Javascript
微信小程序  wx.request合法域名配置详解
Nov 23 Javascript
AngularJS学习第一篇 AngularJS基础知识
Feb 13 Javascript
对angular2中的ngfor和ngif指令嵌套实例讲解
Sep 12 Javascript
在Vue中用canvas实现二维码和图片合成海报的方法
Jun 10 Javascript
vue-cli4.x创建企业级项目的方法步骤
Jun 18 Javascript
在vue中通过axios异步使用echarts的方法
Jan 13 #Javascript
详解基于vue-cli配置移动端自适应
Jan 13 #Javascript
javascript用rem来做响应式开发
Jan 13 #Javascript
深入理解ES6之数据解构的用法
Jan 13 #Javascript
详解ES6语法之可迭代协议和迭代器协议
Jan 13 #Javascript
详解如何在React组件“外”使用父组件的Props
Jan 12 #Javascript
vue使用element-ui的el-input监听不了回车事件的解决方法
Jan 12 #Javascript
You might like
php精度计算的问题解析
2019/06/21 PHP
js 函数调用模式小结
2011/12/26 Javascript
JQuery动画和停止动画实例代码
2013/03/01 Javascript
JavaScript中定义函数的三种方法
2015/03/12 Javascript
使用Node.js配合Nginx实现高负载网络
2015/06/28 Javascript
浅谈angular2的http请求返回结果的subcribe注意事项
2017/03/01 Javascript
使用bootstrap-paginator.js 分页来进行ajax 异步分页请求示例
2017/03/09 Javascript
微信小程序实现带刻度尺滑块功能
2017/03/29 Javascript
微信小程序报错:this.setData is not a function的解决办法
2017/09/27 Javascript
基于BootStrap的文本编辑器组件Summernote
2017/10/27 Javascript
js中获取URL参数的共用方法getRequest()方法实例详解
2018/10/24 Javascript
vue中如何去掉空格的方法实现
2018/11/09 Javascript
仿vue-cli搭建属于自己的脚手架的方法步骤
2019/04/17 Javascript
详解Vue 全局变量,局部变量
2019/04/17 Javascript
使用p5.js实现动态GIF图片临摹重现
2019/10/23 Javascript
javascript设计模式 ? 职责链模式原理与用法实例分析
2020/04/16 Javascript
vue项目接口域名动态获取操作
2020/08/13 Javascript
[00:37]2016完美“圣”典风云人物:rOtk宣传片
2016/12/09 DOTA
[51:53]完美世界DOTA2联赛决赛日 Inki vs LBZS 第二场 11.08
2020/11/10 DOTA
python内存管理分析
2015/04/08 Python
Python中zfill()方法的使用教程
2015/05/20 Python
Python 类与元类的深度挖掘 II【经验】
2016/05/06 Python
python学生信息管理系统(初级版)
2018/10/17 Python
浅谈Python批处理文件夹中的txt文件
2019/03/11 Python
python简单区块链模拟详解
2019/07/03 Python
python中必要的名词解释
2019/11/20 Python
pycharm全局搜索的具体步骤
2020/07/28 Python
英国排名第一的礼品体验公司:Red Letter Days
2018/08/16 全球购物
Python文件操作的面试题
2013/06/22 面试题
出国留学自荐信
2013/10/25 职场文书
党的群众教育实践活动实施方案
2014/06/12 职场文书
教师工作失职检讨书
2014/09/18 职场文书
2015年信访工作总结
2015/04/07 职场文书
2015社区个人工作总结范文
2015/05/13 职场文书
CSS filter 有什么神奇用途
2021/05/25 HTML / CSS
Nginx设置HTTPS的方法步骤 443证书配置方法
2022/03/21 Servers