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+XML 省份和城市之间的联动实现代码
Oct 14 Javascript
图片Slider 带左右按钮的js示例
Aug 30 Javascript
巧用jquery解决下拉菜单被Div遮挡的相关问题
Feb 13 Javascript
简单介绍JavaScript中字符串创建的基本方法
Jul 07 Javascript
js点击按钮实现带遮罩层的弹出视频效果
Dec 19 Javascript
JS模拟按钮点击功能的方法
Dec 22 Javascript
jQuery 常用代码集锦(必看篇)
May 16 Javascript
JavaScript常用正则验证函数实例小结【年龄,数字,Email,手机,URL,日期等】
Jan 23 Javascript
Node.js 使用命令行工具检查更新
Jun 08 Javascript
微信小程序实现单选选项卡切换效果
Jun 19 Javascript
layui使用label标签的方法
Sep 14 Javascript
微信小程序后端实现授权登录
Feb 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
收音机史话 - 1960年代前后的DIY
2021/03/02 无线电
php检查页面是否被百度收录
2015/10/28 PHP
详解PHP中cookie和session的区别及cookie和session用法小结
2016/06/12 PHP
PHP7 foreach() 函数修改
2021/03/09 PHP
JavaScript 类似flash效果的立体图片浏览器
2010/02/08 Javascript
nodejs教程 安装express及配置app.js文件的详细步骤
2013/05/11 NodeJs
如何使用Javascript正则表达式来格式化XML内容
2013/07/04 Javascript
巧用js提交表单轻松解决一个页面有多个提交按钮
2013/11/17 Javascript
jQuery遍历Table应用示例
2014/04/09 Javascript
js图片处理示例代码
2014/05/12 Javascript
jQuery学习总结之jQuery事件
2014/06/30 Javascript
浅谈javascript中for in 和 for each in的区别
2015/04/23 Javascript
Vue.js组件通信的几种姿势
2017/10/23 Javascript
从源码里了解vue中的nextTick的使用
2018/11/22 Javascript
vue-cli3 配置开发与测试环境详解
2019/05/17 Javascript
jQuery实现点击滚动到指定元素上的方法分析
2020/03/19 jQuery
JavaScript实现10秒后再次获取验证码
2020/12/02 Javascript
Python3.x中自定义比较函数
2015/04/24 Python
浅析Python中将单词首字母大写的capitalize()方法
2015/05/18 Python
Python random模块用法解析及简单示例
2017/12/18 Python
python实现自动发送报警监控邮件
2018/06/21 Python
python 读取文件并把矩阵转成numpy的两种方法
2019/02/12 Python
导致python中import错误的原因是什么
2020/07/01 Python
如何用Python 实现全连接神经网络(Multi-layer Perceptron)
2020/10/15 Python
新书吧创业计划书
2014/01/31 职场文书
团购业务员岗位职责
2014/03/15 职场文书
怎样拟定创业计划书
2014/05/01 职场文书
应届硕士毕业生自荐信
2014/05/26 职场文书
销售活动策划方案
2014/08/26 职场文书
2014离婚协议书范文(3篇)
2014/11/29 职场文书
先进班组材料范文
2014/12/25 职场文书
2015毕业生实习期工作总结
2015/04/09 职场文书
单位领导婚礼致辞
2015/07/28 职场文书
青年干部培训班学习心得体会
2016/01/06 职场文书
医学会议开幕词
2016/03/03 职场文书
大学生暑期社会实践的个人总结!
2019/07/17 职场文书