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 相关文章推荐
JavaScript 参考教程
Dec 29 Javascript
基于jquery封装的一个js分页
Nov 15 Javascript
JQuery操作三大控件(下拉,单选,复选)的方法
Aug 06 Javascript
用js正确判断用户名cookie是否存在的方法
Jan 28 Javascript
jQuery获取和设置表单元素的方法
Feb 14 Javascript
用jquery仿做发微博功能示例
Apr 18 Javascript
JavaScript学习笔记--常用的互动方法
Dec 07 Javascript
BootStrap中的模态框(modal,弹出层)功能示例代码
Nov 02 Javascript
微信小程序实现发送验证码按钮效果
Dec 20 Javascript
vue router总结 $router和$route及router与 router与route区别
Jul 05 Javascript
JS代码简洁方式之函数方法详解
Jul 28 Javascript
js作用域及作用域链工作引擎
Jul 07 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
zend framework重定向方法小结
2016/05/28 PHP
Laravel框架实现redis集群的方法分析
2017/09/14 PHP
关于实现代码语法标亮 dp.SyntaxHighlighter
2007/02/02 Javascript
打开超链需要“确认”对话框的方法
2007/03/08 Javascript
javascript sudoku 数独智力游戏生成代码
2010/03/27 Javascript
jQuery中offsetParent()方法用法实例
2015/01/19 Javascript
jQuery定义背景动态切换效果的方法
2015/03/23 Javascript
jQuery插件Skippr实现焦点图幻灯片特效
2015/04/12 Javascript
利用JavaScript的AngularJS库制作电子名片的方法
2015/06/18 Javascript
JS实现仿雅虎首页快捷登录入口及导航模块效果
2015/09/19 Javascript
js实现的星星评分功能函数
2015/12/09 Javascript
Javascript获取统一管理的提示语(message)
2016/02/03 Javascript
json实现添加、遍历与删除属性的方法
2016/06/17 Javascript
jQuery设置和获取select、checkbox、radio的选中值方法
2017/01/01 Javascript
vue2+el-menu实现路由跳转及当前项的设置方法实例
2017/11/07 Javascript
React native ListView 增加顶部下拉刷新和底下点击刷新示例
2018/04/27 Javascript
vue中Axios的封装与API接口的管理详解
2018/08/09 Javascript
[54:10]完美世界DOTA2联赛PWL S2 Magma vs FTD 第二场 11.29
2020/12/03 DOTA
Python复制目录结构脚本代码分享
2015/03/06 Python
在Python中使用SimpleParse模块进行解析的教程
2015/04/11 Python
Python基于PycURL自动处理cookie的方法
2015/07/25 Python
浅谈python为什么不需要三目运算符和switch
2016/06/17 Python
Python代码解决RenderView窗口not found问题
2016/08/28 Python
Python2.X/Python3.X中urllib库区别讲解
2017/12/19 Python
Python3+Pycharm+PyQt5环境搭建步骤图文详解
2019/05/29 Python
python爬虫中多线程的使用详解
2019/09/23 Python
python实现大战外星人小游戏实例代码
2019/12/26 Python
TensorFlow实现保存训练模型为pd文件并恢复
2020/02/06 Python
python进行参数传递的方法
2020/05/12 Python
美国时尚大码女装购物网站:Avenue
2019/05/24 全球购物
如何查看在weblogic中已经发布的EJB
2012/06/01 面试题
一套Delphi的笔试题二
2013/05/11 面试题
食品安全工作实施方案
2014/03/26 职场文书
学习退步检讨书
2014/09/28 职场文书
2015年仓库工作总结
2015/04/09 职场文书
办公经费申请报告
2015/05/15 职场文书