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判断鼠标同时离开两个div的思路及代码
May 31 Javascript
jquery将一个表单序列化为一个对象的方法
Jan 03 Javascript
一个简单的动态加载js和css的jquery代码
Sep 01 Javascript
jQuery实现鼠标划过展示大图的方法
Mar 09 Javascript
从setTimeout看js函数执行过程
Dec 19 Javascript
使用async await 封装 axios的方法
Jul 09 Javascript
解决vue打包css文件中背景图片的路径问题
Sep 03 Javascript
vue element中axios下载文件(后端Python)
May 10 Javascript
vuejs移动端实现div拖拽移动
Jul 25 Javascript
vue相关配置文件详解及多环境配置详细步骤
May 19 Javascript
vue中使用router全局守卫实现页面拦截的示例
Oct 23 Javascript
html5以及jQuery实现本地图片上传前的预览代码实例讲解
Mar 01 jQuery
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创建PDF中文文档
2006/10/09 PHP
个人站长制做网页常用的php代码
2007/03/03 PHP
php实现mysql数据库备份类
2008/03/20 PHP
destoon二次开发常用数据库操作
2014/06/21 PHP
php搜索文件程序分享
2015/10/30 PHP
网页javascript精华代码集
2007/01/24 Javascript
firefox事件处理之自动查找event的函数(用于onclick=foo())
2010/08/05 Javascript
Jquery中Ajax 缓存带来的影响的解决方法
2011/05/19 Javascript
JQuery中对服务器控件 DropdownList, RadioButtonList, CheckboxList的操作总结
2011/06/28 Javascript
在js中判断checkboxlist(.net控件客户端id)是否有选中
2013/04/11 Javascript
javascript常用函数(1)
2015/11/04 Javascript
javascript随机抽取0-100之间不重复的10个数
2016/02/25 Javascript
Javascript使用uploadify来实现多文件上传
2016/11/16 Javascript
canvas知识总结
2017/01/25 Javascript
十大热门的JavaScript框架和库
2017/03/21 Javascript
通过V8源码看一个关于JS数组排序的诡异问题
2017/08/14 Javascript
React Native实现地址挑选器功能
2017/10/24 Javascript
详解HTML5 使用video标签实现选择摄像头功能
2017/10/25 Javascript
JS实现的找零张数最小问题示例
2017/11/28 Javascript
解决vue单页面应用进入页面加载所有 js 的问题
2020/08/12 Javascript
[02:38]DOTA2亚洲邀请赛小组赛精彩集锦:Wings完美团击溃对手
2017/03/29 DOTA
Python中使用partial改变方法默认参数实例
2015/04/28 Python
详解Django中的form库的使用
2015/07/18 Python
Python基于select实现的socket服务器
2016/04/13 Python
flask入门之文件上传与邮件发送示例
2018/07/18 Python
Numpy中的mask的使用
2018/07/21 Python
Django ValuesQuerySet转json方式
2020/03/16 Python
django在开发中取消外键约束的实现
2020/05/20 Python
Matplotlib animation模块实现动态图
2021/02/25 Python
春秋航空官方网站:Spring Airlines
2017/09/27 全球购物
英国第一独立滑雪板商店:The Snowboard Asylum
2020/01/16 全球购物
请介绍一下WSDL的文档结构
2013/03/17 面试题
个人教师自我评价范文
2013/12/02 职场文书
开办饭店创业计划书
2013/12/28 职场文书
普通员工辞职信
2014/01/17 职场文书
纯CSS实现一个简单步骤条的示例代码
2022/07/15 HTML / CSS