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 相关文章推荐
JS应用之禁止抓屏、复制、打印
Feb 21 Javascript
jquery实现瀑布流效果分享
Mar 26 Javascript
解决JS组件bootstrap table分页实现过程中遇到的问题
Apr 21 Javascript
jQuery Dialog对话框事件用法实例分析
May 10 Javascript
浅谈js之字面量、对象字面量的访问、关键字in的用法
Nov 20 Javascript
原生JS简单实现ajax的方法示例
Nov 29 Javascript
微信小程序 表单Form实例详解(附源码)
Dec 22 Javascript
结合Vue控制字符和字节的显示个数的示例
May 17 Javascript
react native 仿微信聊天室实例代码
Sep 17 Javascript
小程序的上传文件接口的注意要点解析
Sep 17 Javascript
vue移动端使用appClound拉起支付宝支付的实现方法
Nov 21 Javascript
vue中watch和computed的区别与使用方法
Aug 23 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
ThinkPHP添加更新标签的方法
2014/12/05 PHP
常见PHP数据库解决方案分析介绍
2015/09/24 PHP
php中namespace及use用法分析
2016/12/06 PHP
PHP面向对象五大原则之接口隔离原则(ISP)详解
2018/04/04 PHP
PHP测试框架PHPUnit组织测试操作示例
2018/05/28 PHP
JS简单的轮播的图片滚动实例
2013/06/17 Javascript
js 动态修改css文件用到了cssRule
2014/08/20 Javascript
JavaScript中双叹号!!作用示例介绍
2014/09/21 Javascript
小议JavaScript中Generator和Iterator的使用
2015/07/29 Javascript
JQuery实现图片轮播效果
2015/09/15 Javascript
实例代码讲解jquery easyui动态tab页
2015/11/17 Javascript
JS使用eval()动态创建变量的方法
2016/06/03 Javascript
js内置对象处理_打印学生成绩单的简单实现
2016/09/24 Javascript
js获取地址栏参数的两种方法
2017/06/27 Javascript
JS对象序列化成json数据和json数据转化为JS对象的代码
2017/08/23 Javascript
Vue 全局loading组件实例详解
2018/05/29 Javascript
Angular6新特性之Angular Material
2018/12/28 Javascript
JS实现将对象转化为数组的方法分析
2019/01/21 Javascript
HTML元素拖拽功能实现的完整实例
2020/12/04 Javascript
Python实现连接MySql数据库及增删改查操作详解
2019/04/16 Python
如何使用Python实现斐波那契数列
2019/07/02 Python
Django Rest framework解析器和渲染器详解
2019/07/25 Python
PyQt5中多线程模块QThread使用方法的实现
2020/01/31 Python
Python常用GUI框架原理解析汇总
2020/12/07 Python
详解解决jupyter不能使用pytorch的问题
2021/02/18 Python
Reebok俄罗斯官方网上商店:购买锐步运动服装和鞋子
2016/09/26 全球购物
西班牙高科技产品购物网站:MejorDeseo
2019/09/08 全球购物
New delete 与malloc free 的联系与区别
2013/02/04 面试题
共产党员公开承诺书范文
2014/03/28 职场文书
揭牌仪式策划方案
2014/05/28 职场文书
优秀团员事迹材料
2014/12/25 职场文书
《春酒》教学反思
2016/02/22 职场文书
Python爬取科目四考试题库的方法实现
2021/03/30 Python
TensorFlow的自动求导原理分析
2021/05/26 Python
MySQL 全文检索的使用示例
2021/06/07 MySQL
Oracle使用别名的好处
2022/04/19 Oracle