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 document.referrer 用法
Apr 30 Javascript
JS文本框默认值处理详解
Jul 10 Javascript
js中数组Array的一些常用方法总结
Aug 12 Javascript
js实现在同一窗口浏览图片
Sep 17 Javascript
浅谈在js传递参数中含加号(+)的处理方式
Oct 11 Javascript
angularjs中ng-bind-html的用法总结
May 23 Javascript
判断滚动条滑到底部触发事件(实例讲解)
Nov 15 Javascript
JS实现根据详细地址获取经纬度功能示例
Apr 16 Javascript
vue与iframe之间的信息交互的实现
Apr 08 Javascript
微信公众号网页分享功能开发的示例代码
May 27 Javascript
vue-以文件流-blob-的形式-下载-导出文件操作
Aug 07 Javascript
JS实现简易日历效果
Jan 25 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教程孙仲岳主讲
2008/01/07 PHP
php 调用百度sms来发送短信的实现示例
2018/11/02 PHP
PHP常用函数之base64图片上传功能详解
2019/10/21 PHP
js 第二代身份证号码的验证机制代码
2011/05/12 Javascript
javascript数字格式化通用类 accounting.js使用
2012/08/24 Javascript
jquery选择器使用详解
2014/04/08 Javascript
javascript制作sql转换为stringBuffer的小工具
2015/04/03 Javascript
javascript中CheckBox全选终极方案
2015/05/20 Javascript
在JavaScript中操作时间之setYear()方法的使用
2015/06/12 Javascript
jquery Easyui快速开发总结
2015/08/20 Javascript
详解JavaScript的AngularJS框架中的表达式与指令
2016/03/05 Javascript
基于JQuery的$.ajax方法进行异步请求导致页面闪烁的解决办法
2016/05/10 Javascript
不同js异步函数同步的实现方法
2016/05/28 Javascript
BOM系列第一篇之定时器setTimeout和setInterval
2016/08/17 Javascript
简易Vue评论框架的实现(父组件的实现)
2018/01/08 Javascript
JS数组去重的6种方法完整实例
2018/12/08 Javascript
深入了解JavaScript 私有化
2019/05/30 Javascript
vue+vant使用图片预览功能ImagePreview的问题解决
2020/04/10 Javascript
webpack 如何同时输出压缩和未压缩的文件的实现步骤
2020/06/05 Javascript
[43:49]LGD vs CHAOS 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
[01:00:49]DOTA2-DPC中国联赛 正赛 Ehome vs iG BO3 第二场 1月31日
2021/03/11 DOTA
Python生成器的使用方法和示例代码
2019/03/04 Python
python实现AES加密和解密
2019/03/27 Python
解决pytorch 数据类型报错的问题
2021/03/03 Python
新奇的小玩意:IWOOT
2016/07/21 全球购物
美丽的现代设计家具:2Modern
2018/07/26 全球购物
俄罗斯建筑和装饰材料在线商店:Stroilandia
2020/07/25 全球购物
学校教研活动总结
2014/07/02 职场文书
秋季运动会演讲稿
2014/09/16 职场文书
井冈山红色之旅心得体会
2014/10/07 职场文书
2014三年级班主任工作总结
2014/12/05 职场文书
世界水日宣传活动总结
2015/02/09 职场文书
中国世界遗产导游词
2015/02/13 职场文书
会计出纳岗位职责
2015/03/31 职场文书
详解Spring Bean的配置方式与实例化
2022/06/10 Java/Android
Java界面编程实现界面跳转
2022/06/16 Java/Android