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 相关文章推荐
jQuery 1.3 和 Validation 验证插件1.5.1
Jul 09 Javascript
qTip 基于JQuery的Tooltip插件[兼容性好]
Sep 01 Javascript
js string 转 int 注意的问题小结
Aug 15 Javascript
jQuery经过一段时间自动隐藏指定元素的方法
Mar 17 Javascript
jquery插件jquery.beforeafter.js实现左右拖拽分隔条对比图片的方法
Aug 07 Javascript
Angularjs 自定义服务的三种方式(推荐)
Aug 02 Javascript
javascript实现获取指定精度的上传文件的大小简单实例
Oct 25 Javascript
EasyUI的DataGrid每行数据添加操作按钮的实现代码
Aug 22 Javascript
create-react-app构建项目慢的解决方法
Mar 14 Javascript
vue+webpack中配置ESLint
Nov 07 Javascript
JavaScript实现的鼠标跟随特效示例【2则实例】
Dec 22 Javascript
VUE安装使用教程详解
Jun 03 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 面向对象 PHP5 中的常量
2010/05/05 PHP
php版微信支付api.mch.weixin.qq.com域名解析慢原因与解决方法
2016/10/12 PHP
PHP计算近1年的所有月份
2017/03/13 PHP
laravel 中如何使用ajax和vue总结
2017/08/16 PHP
javascript,jquery闭包概念分析
2010/06/19 Javascript
使用jQuery和Bootstrap实现多层、自适应模态窗口
2014/12/22 Javascript
提高jQuery性能优化的技巧
2015/08/03 Javascript
JavaScript 数组的深度复制解析
2016/11/02 Javascript
swiper自定义分页器使用方法详解
2020/09/14 Javascript
Vue可自定义tab组件用法实例
2019/10/24 Javascript
vue使用swiper实现中间大两边小的轮播图效果
2019/11/24 Javascript
JavaScript基于SVG的图片切换效果实例代码
2020/12/15 Javascript
python BeautifulSoup使用方法详解
2013/11/21 Python
Python中字典和JSON互转操作实例
2015/01/19 Python
用Python给文本创立向量空间模型的教程
2015/04/23 Python
在Python中处理时间之clock()方法的使用
2015/05/22 Python
Python建立Map写Excel表实例解析
2018/01/17 Python
Python将一个Excel拆分为多个Excel
2018/11/07 Python
浅谈Python中(&amp;,|)和(and,or)之间的区别
2019/08/07 Python
Python实现Singleton模式的方式详解
2019/08/08 Python
python SVD压缩图像的实现代码
2019/11/05 Python
Python 词典(Dict) 加载与保存示例
2019/12/06 Python
python读取Kafka实例
2019/12/23 Python
通过实例了解Python str()和repr()的区别
2020/01/17 Python
Pycharm debug调试时带参数过程解析
2020/02/03 Python
python实现最速下降法
2020/03/24 Python
德国柯吉澳趣味家居:Koziol
2017/08/24 全球购物
自我鉴定四大框架
2014/01/17 职场文书
2014学雷锋活动心得体会
2014/03/10 职场文书
气象学专业个人求职信
2014/04/22 职场文书
质量安全标语
2014/06/07 职场文书
大四优秀党员个人民主评议
2014/09/19 职场文书
2015年员工工作总结范文
2015/04/08 职场文书
难以忽视的真相观后感
2015/06/05 职场文书
小学生读书笔记
2015/07/01 职场文书
PyTorch dropout设置训练和测试模式的实现
2021/05/27 Python