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入门教程(10) 认识其他对象
Jan 31 Javascript
Javascript load Page,load css,load js实现代码
Mar 31 Javascript
Extjs列表详细信息窗口新建后自动加载解决方法
Apr 02 Javascript
jQuery中使用each处理json数据
Apr 23 Javascript
AngularJs expression详解及简单示例
Sep 01 Javascript
浅谈JS中的三种字符串连接方式及其性能比较
Sep 02 Javascript
bootstrap table动态加载数据示例代码
Mar 25 Javascript
vue插件实现v-model功能
Sep 10 Javascript
微信小程序分享海报生成的实现方法
Dec 10 Javascript
小程序实现层叠卡片滑动效果
Aug 26 Javascript
基于vue-simple-uploader封装文件分片上传、秒传及断点续传的全局上传插件功能
Feb 23 Vue.js
vue使用localStorage持久性存储实现评论列表
Apr 14 Vue.js
在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
解析func_num_args与func_get_args函数的使用
2013/06/24 PHP
thinkphp3.x中cookie方法的用法分析
2016/05/19 PHP
php实现博客,论坛图片防盗链的方法
2016/10/15 PHP
Javascript页面添加到收藏夹的简单方法
2013/08/07 Javascript
javascript 树形导航菜单实例代码
2013/08/13 Javascript
javascript 获取HTML DOM父、子、临近节点
2014/06/16 Javascript
JavaScript将Web页面内容导出到Word及Excel的方法
2015/02/13 Javascript
js实现感应鼠标图片透明度变化的方法
2015/02/20 Javascript
JavaScript精炼之构造函数 Constructor及Constructor属性详解
2015/11/05 Javascript
jQuery webuploader分片上传大文件
2016/11/07 Javascript
利用VUE框架,实现列表分页功能示例代码
2017/01/12 Javascript
vuejs响应用户事件(如点击事件)
2017/03/14 Javascript
vue bus全局事件中心简单Demo详解
2018/02/26 Javascript
vue对storejs获取的数据进行处理时遇到的几种问题小结
2018/03/20 Javascript
JS 实现获取验证码 倒计时功能
2018/10/29 Javascript
微信小程序实现弹出菜单动画
2019/06/21 Javascript
es6函数之尾递归用法实例分析
2020/04/25 Javascript
Python编程判断一个正整数是否为素数的方法
2017/04/14 Python
matplotlib绘制动画代码示例
2018/01/02 Python
python实现最长公共子序列
2018/05/22 Python
Python3.5迭代器与生成器用法实例分析
2019/04/30 Python
Python中Numpy ndarray的使用详解
2019/05/24 Python
Python中实现输入超时及如何通过变量获取变量名
2020/01/18 Python
Python数据可视化处理库PyEcharts柱状图,饼图,线性图,词云图常用实例详解
2020/02/10 Python
详解PyQt5信号与槽的几种高级玩法
2020/03/24 Python
Python实现转换图片背景颜色代码
2020/04/30 Python
Python爬虫获取页面所有URL链接过程详解
2020/06/04 Python
HTML5-WebSocket实现聊天室示例
2016/12/15 HTML / CSS
医务人员竞聘职务自我评价分享
2013/11/08 职场文书
妇联主席先进事迹
2014/05/18 职场文书
大学生安全教育主题班会
2015/08/12 职场文书
私人贷款担保书该怎么写呢?
2019/07/02 职场文书
JavaScript实现登录窗体
2021/06/22 Javascript
Python各协议下socket黏包问题原理
2022/04/12 Python
mysql如何查询连续记录
2022/05/11 MySQL
Python sklearn分类决策树方法详解
2022/09/23 Python