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操作word的参考代码
Oct 26 Javascript
Jquery ajaxStart()与ajaxStop()方法(实例讲解)
Dec 18 Javascript
jQuery实现点击按钮弹出可关闭层的浮动层插件
Sep 19 Javascript
Bootstrap和Angularjs配合自制弹框的实例代码
Aug 24 Javascript
Angularjs中三种数据的绑定策略(“@”,“=”,“&amp;”)
Dec 23 Javascript
原生js封装自定义滚动条
Mar 24 Javascript
Angular angular-file-upload文件上传的示例代码
Aug 23 Javascript
微信打开网址添加在浏览器中打开提示的办法
May 20 Javascript
微信小程序解析富文本过程详解
Jul 13 Javascript
layui中的switch开关实现方法
Sep 03 Javascript
ant-design-vue 实现表格内部字段验证功能
Dec 16 Javascript
Vue项目前后端联调(使用proxyTable实现跨域方式)
Jul 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中通过ADO调用Access数据库的方法测试不通过
2006/12/31 PHP
PHP操作MongoDB GridFS 存储文件的详解
2013/06/20 PHP
深入apache配置文件httpd.conf的部分参数说明
2013/06/28 PHP
php curl_init函数用法
2014/01/31 PHP
ThinkPHP连接数据库及主从数据库的设置教程
2014/08/22 PHP
php实现在限定区域里自动调整字体大小的类实例
2015/04/02 PHP
实例讲解PHP页面静态化
2018/02/05 PHP
PHP PDOStatement::getColumnMeta讲解
2019/02/01 PHP
Three.js源码阅读笔记(基础的核心Core对象)
2012/12/27 Javascript
JQuery中关于jquery.js与jquery.min.js的比较探讨
2013/05/15 Javascript
js中apply方法的使用详细解析
2013/11/04 Javascript
深入理解JavaScript系列(39):设计模式之适配器模式详解
2015/03/04 Javascript
JavaScript中通过prototype属性共享属性和方法的技巧实例
2015/03/13 Javascript
javascript中indexOf技术详解
2015/05/07 Javascript
Javascript实现检测客户端类型代码封包
2015/12/03 Javascript
NodeJS基础API搭建服务器详细过程记录
2017/04/01 NodeJs
从理论角度讨论JavaScript闭包
2019/04/03 Javascript
js实现无缝滚动双图切换效果
2019/07/09 Javascript
vue实现tab栏点击高亮效果
2020/08/19 Javascript
Python生成pdf文件的方法
2014/08/04 Python
python爬虫入门教程之点点美女图片爬虫代码分享
2014/09/02 Python
Python 查找list中的某个元素的所有的下标方法
2018/06/27 Python
python中sys.argv函数精简概括
2018/07/08 Python
Python with关键字,上下文管理器,@contextmanager文件操作示例
2019/10/17 Python
Django 限制访问频率的思路详解
2019/12/24 Python
解决TensorFlow程序无限制占用GPU的方法
2020/06/30 Python
CSS3圆角和渐变2种常用功能详解
2016/01/06 HTML / CSS
全球知名的珠宝首饰品牌:Kay Jewelers
2018/02/11 全球购物
美国浴缸、水槽和水龙头购物网站:Vintage Tub & Bath
2019/11/05 全球购物
介绍一下sql server的安全性
2014/08/10 面试题
老干部工作先进事迹
2014/08/17 职场文书
英语导游词
2015/02/13 职场文书
小学生节约用水倡议书
2019/08/12 职场文书
使用Python的开发框架Brownie部署以太坊智能合约
2021/05/28 Python
正则表达式拆分url实例代码
2022/02/24 Java/Android
MySQL GTID复制的具体使用
2022/05/20 MySQL