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的表头固定的若干方法
Jan 27 Javascript
使用PHP+JQuery+Ajax分页的实现
Apr 23 Javascript
jQuery 关于伪类选择符的使用说明
Apr 24 Javascript
js中arguments,caller,callee,apply的用法小结
Jan 28 Javascript
JQuery仿小米手机抢购页面倒计时效果
Dec 16 Javascript
jQuery实现只允许输入数字和小数点的方法
Mar 02 Javascript
移动端横屏的JS代码(beta)
May 16 Javascript
BootStrap 智能表单实战系列(二)BootStrap支持的类型简介
Jun 13 Javascript
原生js实现焦点轮播图效果
Jan 12 Javascript
微信小程序实现动态设置placeholder提示文字及按钮选中/取消状态的方法
Dec 14 Javascript
JavaScript实现图片上传并预览并提交ajax
Sep 30 Javascript
利用js实现简单开关灯代码
Nov 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
PHP5下$_SERVER变量不再受magic_quotes_gpc保护的弥补方法
2012/10/31 PHP
PHP使用静态方法的几个注意事项
2014/09/16 PHP
详解php中 === 的使用
2016/10/24 PHP
js操作Xml(向服务器发送Xml,处理服务器返回的Xml)(IE下有效)
2009/01/30 Javascript
Javascript中的var_dump函数实现代码
2009/09/07 Javascript
jQuery 树形结构的选择器
2010/02/15 Javascript
jQuery实现用方向键控制层的上下左右移动
2013/01/13 Javascript
jQuery产品间断向下滚动效果核心代码
2014/05/08 Javascript
创建你的第一个AngularJS应用的方法
2015/06/16 Javascript
javascript中类的定义方式详解(四种方式)
2015/12/22 Javascript
Svg.js实例教程及使用手册详解(一)
2016/05/16 Javascript
AngularJS入门教程之REST和定制服务详解
2016/08/19 Javascript
EasyUI的doCellTip实现鼠标放到单元格上提示单元格内容
2016/08/24 Javascript
Bootstrap CSS组件之按钮下拉菜单
2016/12/17 Javascript
微信小程序url与token设置详解
2017/09/26 Javascript
基于jquery.page.js实现分页效果
2018/01/01 jQuery
nodeJs实现基于连接池连接mysql的方法示例
2018/02/10 NodeJs
layui实现checkbox的目录树tree的例子
2019/09/12 Javascript
Python使用PIL库实现验证码图片的方法
2016/03/11 Python
python机器学习理论与实战(五)支持向量机
2018/01/19 Python
python的dataframe转换为多维矩阵的方法
2018/04/11 Python
Python之dict(或对象)与json之间的互相转化实例
2018/06/05 Python
Python for循环及基础用法详解
2019/11/08 Python
python 实现绘制整齐的表格
2019/11/18 Python
python科学计算之numpy——ufunc函数用法
2019/11/25 Python
Python pip 常用命令汇总
2020/10/19 Python
详解px单位html5响应式方案
2018/03/08 HTML / CSS
康帕斯酒店预订:Compass Hospitality(支持中文)
2018/08/23 全球购物
Furla官网:意大利著名的皮革品牌
2019/08/06 全球购物
医院护士求职自荐信格式
2013/09/21 职场文书
关于礼仪的演讲稿
2014/01/04 职场文书
迎新晚会邀请函
2014/02/01 职场文书
科技之星事迹材料
2014/06/02 职场文书
2014年后勤管理工作总结
2014/12/01 职场文书
经费申请报告
2015/05/15 职场文书
2016简单的租房合同范本
2016/03/18 职场文书