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 函数链之演变
Apr 07 Javascript
Jquery公告滚动+AJAX后台得到数据
Apr 14 Javascript
JavaScript制作简易的微信打飞机
Mar 31 Javascript
浅谈js中startsWith 函数不能在任何浏览器兼容的问题
Mar 01 Javascript
jQuery插件zTree实现清空选中第一个节点所有子节点的方法
Mar 08 Javascript
jQuery使用EasyUi实现三级联动下拉框效果
Mar 08 Javascript
Vue2仿淘宝实现省市区三级联动
Apr 15 Javascript
浅谈jquery fullpage 插件增加头部和版权的方法
Mar 20 jQuery
解决layui前端框架 form表单,table表等内置控件不显示的问题
Aug 19 Javascript
微信小程序+云开发实现欢迎登录注册
May 24 Javascript
解决layUI的页面显示不全的问题
Sep 20 Javascript
浅谈vue 二级路由嵌套和二级路由高亮问题
Aug 06 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
全国FM电台频率大全 - 27 陕西省
2020/03/11 无线电
使用PHP获取网络文件的实现代码
2010/01/01 PHP
基于php伪静态的实现详细介绍
2013/04/28 PHP
解析PHP中的正则表达式以及模式匹配
2013/06/19 PHP
PHP中is_dir()函数使用指南
2015/05/08 PHP
PHP排序二叉树基本功能实现方法示例
2018/05/26 PHP
JS window.opener返回父页面的应用
2009/10/24 Javascript
js中将字符串转换成json的三种方式
2011/01/12 Javascript
JavaScript将Table导出到Excel实现思路及代码
2013/03/13 Javascript
JavaScript实现点击按钮后变灰避免多次重复提交
2013/07/15 Javascript
jquery处理json数据实例分析
2014/06/03 Javascript
javascript对中文按照拼音排序代码
2014/08/20 Javascript
Laydate时间组件在火狐浏览器下有多时间输入框时只能给第一个输入框赋值的解决方法
2016/08/18 Javascript
JavaScript中for循环的几种写法与效率总结
2017/02/03 Javascript
微信小程序实现锚点定位楼层跳跃的实例
2017/05/18 Javascript
Angular.JS中指令ng-if的注意事项小结
2017/06/21 Javascript
vue实现提示保存后退出的方法
2018/03/15 Javascript
使用JavaScript保存文本文件到本地的两种方法
2019/01/22 Javascript
BootStrap表单验证中的非Submit类型按钮点击时触发验证的坑
2019/09/05 Javascript
[09:23]国际邀请赛采访专栏:iG战队VK,Tongfu战队Cu
2013/08/05 DOTA
Python中List.index()方法的使用教程
2015/05/20 Python
对numpy中数组元素的统一赋值实例
2018/04/04 Python
详解django三种文件下载方式
2018/04/06 Python
python基于paramiko将文件上传到服务器代码实现
2019/07/08 Python
Django Channels 实现点对点实时聊天和消息推送功能
2019/07/17 Python
django 类视图的使用方法详解
2019/07/24 Python
用python实现学生管理系统
2020/07/24 Python
澳大利亚汽车零部件、音响及配件超市:Automotive Superstore
2018/06/19 全球购物
美国CVS药店官网:CVS Pharmacy
2018/07/26 全球购物
作文评语集锦
2014/12/25 职场文书
实习介绍信模板
2015/01/30 职场文书
2015年教学工作总结
2015/04/02 职场文书
2015年中秋晚会主持词
2015/07/01 职场文书
2016学校先进党组织事迹材料
2016/02/29 职场文书
Redis实战高并发之扣减库存项目
2022/04/14 Redis
css3手动实现pc端横向滚动
2022/06/21 HTML / CSS