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 相关文章推荐
Prototype RegExp对象 学习
Jul 19 Javascript
javascript函数以及基础写法100多条实用整理
Jan 13 Javascript
jQuery div层的放大与缩小简单实现代码
Mar 28 Javascript
jquery中$(#form :input)与$(#form input)的区别
Aug 18 Javascript
JQuery替换DOM节点的方法
Jun 11 Javascript
jQuery实现鼠标滚动图片延迟加载效果附源码下载
Jun 28 Javascript
jQuery实现的兼容性浮动层示例
Aug 02 Javascript
适用于手机端的jQuery图片滑块动画
Dec 09 Javascript
node.js的Express服务器基本使用教程
Jan 09 Javascript
Vue 实现手动刷新组件的方法
Feb 19 Javascript
react native 仿微信聊天室实例代码
Sep 17 Javascript
React服务端渲染原理解析与实践
Mar 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自定义大小验证码的方法详解
2013/06/07 PHP
memcache命令启动参数中文解释
2014/01/13 PHP
php实现压缩多个CSS与JS文件的方法
2014/11/11 PHP
php面向对象的用户登录身份验证
2017/06/08 PHP
php解析非标准json、非规范json的方式实例
2020/12/10 PHP
javascript延时加载之defer测试
2012/12/28 Javascript
JS对select控件option选项的增删改查示例代码
2013/10/21 Javascript
复杂的javascript窗口分帧解析
2016/02/19 Javascript
JS 对象(Object)和字符串(String)互转方法
2016/05/20 Javascript
AngularJS指令与控制器之间的交互功能示例
2016/12/14 Javascript
jquery 判断是否支持Placeholder属性的方法
2017/02/07 Javascript
Angular2 Service实现简单音乐播放器服务
2017/02/24 Javascript
深入学习nodejs中的async模块的使用方法
2017/07/12 NodeJs
vue实现仿淘宝结账页面实例代码
2017/11/08 Javascript
使用Bootstrap4 + Vue2实现分页查询的示例代码
2017/12/21 Javascript
vue和react等项目中更简单的实现展开收起更多等效果示例
2018/02/22 Javascript
Angular6封装http请求的步骤详解
2018/08/13 Javascript
一文看懂如何简单实现节流函数和防抖函数
2019/09/05 Javascript
浅析 Vue 3.0 的组装式 API(一)
2020/08/31 Javascript
Python提示[Errno 32]Broken pipe导致线程crash错误解决方法
2014/11/19 Python
Python3转换html到pdf的不同解决方案
2019/03/11 Python
python 实现按对象传值
2019/12/26 Python
python实现按键精灵找色点击功能教程,使用pywin32和Pillow库
2020/06/04 Python
HTML5中的强制下载属性download使用实例解析
2016/05/12 HTML / CSS
医院后勤自我鉴定
2013/10/13 职场文书
师范教师毕业鉴定
2014/01/13 职场文书
新学期班主任寄语
2014/01/18 职场文书
单位未婚证明范本
2014/01/18 职场文书
经理任命书模板
2014/06/06 职场文书
会计试用期自我评价怎么写
2014/09/18 职场文书
置业顾问岗位职责
2015/02/09 职场文书
工作服管理制度范本
2015/08/06 职场文书
高中数学课堂教学反思
2016/02/18 职场文书
教你用Python写一个植物大战僵尸小游戏
2021/04/25 Python
PostgreSQL聚合函数介绍以及分组和排序
2022/04/12 PostgreSQL
Python采集爬取京东商品信息和评论并存入MySQL
2022/04/12 Python