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 相关文章推荐
setTimeout和setInterval的区别你真的了解吗?
Mar 31 Javascript
script不刷新页面的联动前后代码
Sep 18 Javascript
Javascript设计模式之观察者模式的多个实现版本实例
Mar 03 Javascript
原生js实现无缝轮播图效果
Jan 11 Javascript
jquery拼接ajax 的json和字符串拼接的方法
Mar 11 Javascript
jQuery插件FusionCharts绘制2D环饼图效果示例【附demo源码】
Apr 10 jQuery
JS中使用react-tooltip插件实现鼠标悬浮显示框
May 15 Javascript
VUE脚手架具体使用方法
May 20 Javascript
js针对图片加载失败的处理方法分析
Aug 24 Javascript
微信小程序登陆注册功能的实现代码
Dec 10 Javascript
你知道JavaScript Symbol类型怎么用吗
Jan 08 Javascript
【js设计模式】SOLID五大设计原则
Mar 24 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中for循环语句的几种变型
2006/11/26 PHP
smarty模板中拼接字符串的方法
2014/02/14 PHP
PHP中__FILE__、dirname与basename用法实例分析
2014/12/01 PHP
Discuz!X中SESSION机制实例详解
2015/09/23 PHP
抛弃 PHP 代价太高
2016/04/26 PHP
jQuery中after的两种用法实例
2013/07/03 Javascript
httpclient模拟登陆具体实现(使用js设置cookie)
2013/12/11 Javascript
ActiveX控件与Javascript之间的交互示例
2014/06/04 Javascript
jquery实现类似淘宝星星评分功能实例
2014/09/12 Javascript
深入理解js数组的sort排序
2016/05/28 Javascript
浅谈ES6新增的数组方法和对象
2017/08/08 Javascript
浅谈webpack下的AOP式无侵入注入
2017/11/12 Javascript
深入浅析JS中的严格模式
2018/06/04 Javascript
在iFrame子页面里实现模态框的方法
2018/08/17 Javascript
Cookbook组件形式:优化 Vue 组件的运行时性能
2018/11/25 Javascript
vue实现div拖拽互换位置
2020/07/29 Javascript
JavaScript对象拷贝与赋值操作实例分析
2018/12/10 Javascript
全面了解JavaScript的作用域链
2019/04/03 Javascript
vue+elementui通用弹窗的实现(新增+编辑)
2021/01/07 Vue.js
[02:35]DOTA2英雄基础教程 狙击手
2014/01/14 DOTA
详解Python之数据序列化(json、pickle、shelve)
2017/03/30 Python
Python3+PyInstall+Sciter解决报错缺少dll、html等文件问题
2019/07/15 Python
Python连接SQLite数据库并进行增册改查操作方法详解
2020/02/18 Python
浅谈python累加求和+奇偶数求和_break_continue
2020/02/25 Python
Django设置Postgresql的操作
2020/05/14 Python
H5页面适配iPhoneX(就是那么简单)
2019/12/02 HTML / CSS
canvas实现图片镜像翻转的2种方式
2020/07/22 HTML / CSS
Stutterheim瑞典:瑞典高级外套时装品牌
2019/06/24 全球购物
李维斯法国官网:Levi’s法国
2019/07/13 全球购物
高级文秘工作总结的自我评价
2013/09/28 职场文书
个人求职简历中英文自我评价
2013/12/16 职场文书
知识竞赛主持词
2014/03/26 职场文书
2014年党支部学习材料
2014/05/19 职场文书
学雷锋主题班会教案
2015/08/13 职场文书
2016入党积极分子心得体会
2016/01/06 职场文书
python读取mnist数据集方法案例详解
2021/09/04 Python