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 强制类型转换函数
May 17 Javascript
JQuery扩展插件Validate 2通过参数设置验证规则
Sep 05 Javascript
javascript题目,重写函数让其无限相加
Feb 15 Javascript
jquery 操作css样式、位置、尺寸方法汇总
Nov 28 Javascript
JavaScript列表框listbox全选和反选的实现方法
Mar 18 Javascript
基于JQuery打造无缝滚动新闻步骤详解
Mar 31 Javascript
Mvc提交表单的四种方法全程详解
Aug 10 Javascript
jQuery实现的省市联动菜单功能示例【测试可用】
Jan 13 Javascript
js绑定事件和解绑事件
Apr 27 Javascript
Layui Form 自定义验证的实例代码
Sep 14 Javascript
利用JavaScript为句子加标题的3种方法示例
Jan 05 Javascript
详解JavaScript中Arguments对象用途
Aug 30 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
swfupload 多文件上传实现代码
2008/08/27 PHP
MyEclipse常用配置图文教程
2014/09/11 PHP
PHP curl伪造IP地址和header信息代码实例
2015/04/27 PHP
几个优化WordPress中JavaScript加载体验的插件介绍
2015/12/17 PHP
Laravel5.1数据库连接、创建数据库、创建model及创建控制器的方法
2016/03/29 PHP
thinkphp验证码的实现(form、ajax实现验证)
2016/07/28 PHP
解决用jquery load加载页面到div时,不执行页面js的问题
2014/02/22 Javascript
js中函数声明与函数表达式
2015/06/03 Javascript
简介AngularJS的HTML DOM支持情况
2015/06/17 Javascript
jQuery+Ajax+PHP+Mysql实现分页显示数据实例讲解
2015/09/27 Javascript
JS使用onerror捕获异常示例
2016/08/03 Javascript
JavaScript实现in-place思想的快速排序方法
2016/08/07 Javascript
js微信扫描二维码登录网站技术原理
2016/12/01 Javascript
Bootstrap CSS组件之导航(nav)
2016/12/17 Javascript
JavaScript this绑定过程深入详解
2018/12/07 Javascript
vue路由传参三种基本方式详解
2019/12/09 Javascript
Vue动态加载图片在跨域时无法显示的问题及解决方法
2020/03/10 Javascript
Vue中函数防抖节流的理解及应用实现
2020/04/24 Javascript
Vue实现图书管理小案例
2020/12/03 Vue.js
python实现中文转换url编码的方法
2016/06/14 Python
定制FileField中的上传文件名称实例
2017/08/23 Python
python通过elixir包操作mysql数据库实例代码
2018/01/31 Python
Python 数据处理库 pandas 入门教程基本操作
2018/04/19 Python
Python3实现的简单验证码识别功能示例
2018/05/02 Python
Python3.5实现的三级菜单功能示例
2019/03/25 Python
对pyqt5中QTabWidget的相关操作详解
2019/06/21 Python
在django项目中导出数据到excel文件并实现下载的功能
2020/03/13 Python
Scrapy框架介绍之Puppeteer渲染的使用
2020/06/19 Python
PyCharm2020.1.1与Python3.7.7的安装教程图文详解
2020/08/07 Python
快速一键生成Python爬虫请求头
2021/03/04 Python
在c#中using和new这两个关键字有什么意义
2013/05/19 面试题
研究生自我鉴定范文
2013/10/30 职场文书
金融事务专业毕业生求职信
2014/02/23 职场文书
人力资源管理系自荐信
2014/05/31 职场文书
法制宣传标语
2014/06/23 职场文书
2015年三八妇女节活动总结
2015/02/06 职场文书