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 相关文章推荐
jQuery操作input值的各种方法总结
Nov 21 Javascript
jquery鼠标放上去显示悬浮层即弹出定位的div层
Apr 25 Javascript
纯CSS3代码实现滑动开关效果
Aug 19 Javascript
使用postMesssage()实现跨域iframe页面间的信息传递方法
Mar 29 Javascript
Bootstrap4一次重大更新 几乎涉及每行代码
May 16 Javascript
JavaScript拖动层Div代码
Mar 01 Javascript
Angular.js中控制器之间的传值详解
Apr 24 Javascript
JavaScript面向对象中接口实现方法详解
Jul 24 Javascript
vue中使用element组件时事件想要传递其他参数的问题
Sep 18 Javascript
electron-vue开发环境内存泄漏问题汇总
Oct 10 Javascript
ES6中let、const的区别及变量的解构赋值操作方法实例分析
Oct 15 Javascript
vue2.0 获取从http接口中获取数据,组件开发,路由配置方式
Nov 04 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模拟SQL Server的两个日期处理函数
2006/10/09 PHP
在PHP中使用与Perl兼容的正则表达式
2006/11/26 PHP
PHP中将数组转成XML格式的实现代码
2011/08/08 PHP
Linux下php5.4启动脚本
2014/08/03 PHP
网上应用的一个不错common.js脚本
2007/08/08 Javascript
基于jQuery的获得各种控件Value的方法
2010/11/19 Javascript
jquery实现输入框动态增减的实例代码
2013/07/14 Javascript
Javascript遍历Html Table示例(包括内容和属性值)
2014/07/08 Javascript
JavaScript取得WEB安全颜色列表的方法
2015/07/14 Javascript
基于html5和nodejs相结合实现websocket即使通讯
2015/11/19 NodeJs
JS数组排序技巧汇总(冒泡、sort、快速、希尔等排序)
2015/11/24 Javascript
详解js运算符单竖杠“|”与“||”的用法和作用介绍
2016/11/04 Javascript
jQuery中clone()函数实现表单中增加和减少输入项
2017/05/13 jQuery
jQuery.Form实现Ajax上传文件同时设置headers的方法
2017/06/26 jQuery
jQuery常用选择器详解
2017/07/17 jQuery
基于JavaScript实现前端数据多条件筛选功能
2020/08/19 Javascript
windows系统下更新nodejs版本的方案
2017/11/24 NodeJs
JS与jQuery判断文本框还剩多少字符可以输入的方法
2018/09/01 jQuery
详解bootstrap-fileinput文件上传控件的亲身实践
2019/03/21 Javascript
ES6知识点整理之函数数组参数的默认值及其解构应用示例
2019/04/17 Javascript
vuex存储token示例
2019/11/11 Javascript
Python 过滤字符串的技巧,map与itertools.imap
2008/09/06 Python
Windows下Eclipse+PyDev配置Python+PyQt4开发环境
2016/05/17 Python
Python随机数random模块使用指南
2016/09/09 Python
Python基于列表list实现的CRUD操作功能示例
2018/01/05 Python
Python基本socket通信控制操作示例
2019/01/30 Python
Python rabbitMQ如何实现生产消费者模式
2020/08/24 Python
ZINVO手表官网:男士和女士手表
2019/03/10 全球购物
外语系毕业生自荐信范文
2013/12/16 职场文书
企业军训感想
2014/02/07 职场文书
十八届三中全会报告学习材料
2014/02/17 职场文书
郭明义电影观后感
2015/06/08 职场文书
同意报考公务员证明
2015/06/17 职场文书
欠条样本
2015/07/03 职场文书
2016银行招聘自荐信
2016/01/28 职场文书
创业计划书之网吧
2019/10/10 职场文书