vue.js学习之递归组件


Posted in Javascript onDecember 13, 2016

递归组件

组件在它的模板内可以递归地调用自己,只有当它有 name 选项时才可以。 在官网这句话就是关键定义组件是一定要有name属性。按照这个思路我们开动吧。

实现最终效果图:

vue.js学习之递归组件

模拟数据格式如下

var data = [{
        "id": "1",
        "data": {
          "menuName": "项目管理",
          "menuCode": "",
        },
        "childTreeNode": [{
          "data": {
            "menuName": "项目",
            "menuCode": "BusProject",
          },
          "childTreeNode": []
        }, {
          "data": {
            "menuName": "我的任务",
            "menuCode": "BusProject",
          },
          "childTreeNode": []
        }, {
          "data": {
            "menuName": "人员周报",
            "menuCode": "BusProject",
          },
          "childTreeNode": []
        }]
      }, {
        "id": "2",
        "data": {
          "menuName": "数据统计",
          "menuCode": "BusClock",
        },
        "childTreeNode": []
      }, {
        "id": "3",
        "data": {
          "menuName": "人事管理",
          "menuCode": "",
        },
        "childTreeNode": []
      }, {
        "id": "4",
        "data": {
          "menuName": "基础管理",
          "menuCode": "",
        },
        "childTreeNode": []
      }]

html我们思路按照ul里面套li,无限ul套li,标题用div元素包裹,

<li>
  <div @click='toggle'>

     <i v-if='isFolder' class="fa " :class="[open?'fa-folder-open':'fa-folder']"></i>


 <!--isFolder判断是否存在子级改变图标-->
     <i v-if='!isFolder' class="fa fa-file-text"></i> {{model.data.menuName}}
   </div>
   <ul v-show="open" v-if='isFolder'>
     <items v-for='cel in model.childTreeNode' :model='cel'></items>
   </ul>
 </li>

官方文档里面写的递归组件强调了使用name属性

export default {
  name: 'items',
  props: ['model'],
  components: {},
}

按照vue的思想,不操作Dom树,我们定义两个变量,一个显示隐藏子菜单(open),一个存不存子菜单修改图标(isFolder)。

data() {
    return {
       open: false,
       isFolder: true
    }
}

利用vue计算属性动态改变isFolder的值,修改图标,判断存在不子级和子级长度

computed: {
  isFolder() {
    return this.model.childTreeNode && this.model.childTreeNode.length
  }
}

显示隐藏事件

methods: {
toggle: function() {
   if(this.isFolder) {
     this.open = !this.open
   }

}
}

写到这里我们已经做完一个树形菜单了如下,最终样式就留给大家自己去实现了我在贴出完整代码供大家参考。

<template>
  <li>
    <div @click='toggle'>
      <i v-if='isFolder' class="fa " :class="[open?'fa-folder-open':'fa-folder']"></i>
      <!--isFolder判断是否存在子级改变图标-->
      <i v-if='!isFolder' class="fa fa-file-text"></i> {{model.data.menuName}}
    </div>
    <ul v-show="open" v-if='isFolder'>
      <items v-for='cel in model.childTreeNode' :model='cel'></items>
    </ul>
  </li>
</template>
<script type="text/javascript">
  export default {
    name: 'items',
    props: ['model'],
    components: {},
    data() {
      return {
        open: false,
        isFolder: true
      }
    },
    computed: {
      isFolder: function() {
        return this.model.childTreeNode && this.model.childTreeNode.length
      }
    },
    methods: {
      toggle: function() {
        if(this.isFolder) {
          this.open = !this.open
        }
      },
    }
  }
</script>

公司最开始是使用easyui做的管理系统,我接手后用vue完整模仿了一些easyui的东西,下面就是在树形菜单基础上模仿出了树形表格,下图为完整图

vue.js学习之递归组件 

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流

Javascript 相关文章推荐
javascript prototype原型操作笔记
Dec 07 Javascript
扩展jquery实现客户端表格的分页、排序功能代码
Mar 16 Javascript
纯JAVASCRIPT图表动画插件Highcharts Examples
Apr 16 Javascript
基于豆瓣API+Angular开发的web App
Jan 02 Javascript
SyntaxHighlighter 3.0.83使用笔记
Jan 26 Javascript
在JavaScript中访问字符串的子串
Jul 07 Javascript
javascript实现省市区三级联动下拉框菜单
Nov 17 Javascript
javascript实现任务栏消息提示的简单实例
May 31 Javascript
node.js中http模块和url模块的简单介绍
Oct 06 Javascript
在Vue组件中使用 TypeScript的方法
Feb 28 Javascript
详解Vue中watch的高级用法
May 02 Javascript
Fetch超时设置与终止请求详解
May 18 Javascript
AngularJS过滤器filter用法总结
Dec 13 #Javascript
ES6通过babel转码使用webpack使用import关键字
Dec 13 #Javascript
AngularJS服务service用法总结
Dec 13 #Javascript
Vue.js中用v-bind绑定class的注意事项
Dec 13 #Javascript
AngularJS中的Promise详细介绍及实例代码
Dec 13 #Javascript
JS中事件冒泡和事件捕获介绍
Dec 13 #Javascript
AngularJS入门教程之路由机制ngRoute实例分析
Dec 13 #Javascript
You might like
PHP生成唯一的促销/优惠/折扣码(附源码)
2012/12/28 PHP
PHP flush()与ob_flush()的区别详解
2013/06/03 PHP
WordPress开发中的get_post_custom()函数使用解析
2016/01/04 PHP
PHP使用PDO创建MySQL数据库、表及插入多条数据操作示例
2019/05/30 PHP
javascript 对象比较实现代码
2009/04/27 Javascript
基于jQuery的动态表格插件
2011/03/28 Javascript
jquery自定义类似$.ajax()的方法实现代码
2013/08/13 Javascript
jquery插件开发之实现jquery手风琴功能分享
2014/03/10 Javascript
JavaScript基础教程之alert弹出提示框实例
2014/10/16 Javascript
localStorage实现便签小程序
2016/11/28 Javascript
Angular2实现自定义双向绑定属性
2017/03/22 Javascript
BootStrap Table前台和后台分页对JSON格式的要求
2017/06/28 Javascript
深入理解Vue 的钩子函数
2018/09/05 Javascript
微信小程序自定义弹窗wcPop插件
2018/11/19 Javascript
BootStrap表单验证中的非Submit类型按钮点击时触发验证的坑
2019/09/05 Javascript
十分钟教你上手ES2020新特性
2020/02/12 Javascript
[37:47]IG vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
[01:04:14]VP vs TNC 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
[55:03]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第二场 11.20
2020/11/20 DOTA
python进阶教程之文本文件的读取和写入
2014/08/29 Python
实例说明Python中比较运算符的使用
2015/05/13 Python
SVM基本概念及Python实现代码
2017/12/27 Python
Python实例方法、类方法、静态方法的区别与作用详解
2019/03/25 Python
Python中面向对象你应该知道的一下知识
2019/07/10 Python
python多进程间通信代码实例
2019/09/30 Python
如何分离django中的媒体、静态文件和网页
2019/11/12 Python
python函数局部变量、全局变量、递归知识点总结
2019/11/15 Python
40个你可能不知道的Python技巧附代码
2020/01/29 Python
python不到50行代码完成了多张excel合并的实现示例
2020/05/28 Python
python抢购软件/插件/脚本附完整源码
2021/03/04 Python
朗仕(Lab series)英国官网:雅诗兰黛集团男士专属护肤品牌
2017/11/28 全球购物
美国餐厅用品和厨房设备批发网站:KaTom Restaurant Supply
2018/01/27 全球购物
2015年清明节活动总结
2015/02/09 职场文书
2015年保险业务员工作总结
2015/05/27 职场文书
如何通过简单的代码描述Angular父组件、子组件传值
2022/04/07 Javascript
MySQL脏读,幻读和不可重复读
2022/05/11 MySQL