自己做个小项目练手,需要用到组件递归,网上查了一些资料,每个代码片段都认识,但是连起来,就一团浆糊。

既然人傻就多思考吧。不明白的点有以下:

1.组件怎么自己调用自己,函数的递归是就是在function fn(){ fn() },组件的递归没有看到这样子的呀。

答:组件中使用name属性,给组件自己定义个名字,这样在组件中就可以自己调用自己了。就像在函数中直接调用函数名来来递归。

2.组件的递归中一层又一层数据是如何获取到的?

答:将嵌套的数据重新赋值给prop设置的属性。

 <tree-menu v-for="(item,index) in model.children"  v-bind:model="item" v-bind:key="index"></tree-menu>

3.组件递归是怎么结束的?

判断数据中是否存在属性,以及该属性的值不为空。见下面代码中的haschild方法。

      hasChild(){
return this.model.children && this.model.children.length
}

下面的代码来自https://www.jianshu.com/p/84eb67487113

准备数据文件——testdata.js

var demoData = [
{
'id': '1',
'menuName': '基础管理',
'menuCode': '10',
'children': [
{
'menuName': '用户管理',
'menuCode': '11'
},
{
'menuName': '角色管理',
'menuCode': '12',
'children': [
{
'menuName': '管理员',
'menuCode': '121'
},
{
'menuName': 'CEO',
'menuCode': '122'
},
{
'menuName': 'CFO',
'menuCode': '123'
},
{
'menuName': 'COO',
'menuCode': '124'
},
{
'menuName': '普通人',
'menuCode': '124'
}
]
},
{
'menuName': '权限管理',
'menuCode': '13'
}
]
},
{
'id': '2',
'menuName': '商品管理',
'menuCode': ''
},
{
'id': '3',
'menuName': '订单管理',
'menuCode': '30',
'children': [
{
'menuName': '订单列表',
'menuCode': '31'
},
{
'menuName': '退货列表',
'menuCode': '32',
'children': []
}
]
},
{
'id': '4',
'menuName': '商家管理',
'menuCode': '',
'children': []
}
]; export default demoData;

父组件

<template>
<div class="tree-menu">
<ul v-for="menuItem in theModel">
//使用子组件,并将数据传给子组件的model属性上,供子组件使用。
<my-tree :model="menuItem"></my-tree>
</ul>
</div>
</template> <script>
import testData from './testdata';
import myTree from './treeMenu'; export default {
//name属性是组件的名字,这样组件才能调用组件自己。
name: "side-bar",
components: {
//即treeMenu文件,它在side-bar组件中的名字设置为了myTree。
myTree
},
data() {
return {
//绑定数据供v-for循环使用。
theModel: testData
}
}
}
</script>

子组件treeMenu(树形组件,递归)

<template>
<li>
//控制图标的显示
<span @click="toggle">
<i v-if="hasChild" class="icon" v-bind:class="[open ? 'folder-open': 'folder' ]"></i>
<i v-if="!hasChild" class="icon file-text"></i>
{{model.menuName}}
</span>
//判断数据中是否有可遍历的属性。
<ul v-show="open" v-if="hasChild">
//如果有可遍历的属性,调用组件自己(tree-menu),获取下一层可以遍历的数据,将下一层可遍历属性绑定到model作为model新的数据。
//key用来标识组件的唯一性,避免重复渲染。
<tree-menu v-for="(item,index) in model.children" v-bind:model="item" v-bind:key="index"></tree-menu>
</ul>
</li>
</template> <script>
export default {
//name属性定义组件名,有了名字组件才可以调用自己。
name: "treeMenu",
props: ['model'],
data(){
return {
open:false
}
},
computed:{
hasChild(){
//有children属性且属性值的长度不为零,那么就递归。
return this.model.children && this.model.children.length
}
},
methods:{
toggle(){
if(this.hasChild){
this.open = !this.open
}
}
}
}
</script>
 

vue组件递归的一些理解的更多相关文章

  1. vue组件的一些知识理解

    组件我们在项目中会很常用到,说下自己在学习过程中的理解,有关 组件初始化顺序,组件为什么data是function,组件的生命周期 1. Vue.component('', {})  注册全局组件,组 ...

  2. vue组件递归

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. vue - Vue组件化编程

    今天是对vue组件化的一个理解,最主要的单文件组件,然后就可以脚手架的学习了,本来昨晚就该上传的,但是用的那个上传博客园的Python脚本不行了,换了一个新的. 组件化让我越来越感觉到框架的力量了 一 ...

  4. vue笔记 递归组件的使用

    递归组件 什么是递归组件? 组件自身去调用组件自身. 代码示例 DetailList.vue(子组件-递归组件) <template> <div> <div class= ...

  5. vue 之组件递归;

    在开发一个 PC 端的项目时,需要开发一个树状结构,直接上效果图如下:点击 "+" 号的时候则展开下一级,点击 "-" 号的时候则收起: 之所以写这篇博客,因为 ...

  6. 深入理解 Vue 组件

    深入理解 Vue 组件 组件使用中的细节点 使用 is 属性,解决组件使用中的bug问题 <!DOCTYPE html> <html lang="en"> ...

  7. 【Vue.js实战案例】- Vue.js递归组件实现组织架构树和选人功能

    大家好!先上图看看本次案例的整体效果. 浪奔,浪流,万里涛涛江水永不休.如果在jq时代来实这个功能简直有些噩梦了,但是自从前端思想发展到现在的以MVVM为主流的大背景下,来实现一个这样繁杂的功能简直不 ...

  8. 用Vue.js递归组件构建一个可折叠的树形菜单

    在Vue.js中一个递归组件调用的是其本身,如: Vue.component('recursive-component', {   template: `<!--Invoking myself! ...

  9. vue+element UI以组件递归方式实现多级导航菜单

    介绍 这是一个是基于element-UI的导航菜单组件基础上,进行了二次封装的菜单组件,该组件以组件递归的方式,实现了可根据从后端接收到的json菜单数据,动态渲染多级菜单的功能. 使用方法 由于该组 ...

随机推荐

  1. fatal error C1003: error count exceeds number; stopping compilation解决方法

    [error]C1003: error count exceeds 100; stopping compilation ...winnt.h 在项目工程中添加#include<windows.h ...

  2. HTML与CSS学习记录

    title: HTML与CSS学习记录 toc: true date: 2018-09-10 14:04:59 <HTML与CSS进阶教程读书笔记> HTML基础知识 HTML与XHTML ...

  3. C#post调用接口并上传文件

    /// <summary> /// C#调用接口上传json数据,并且带文件上传 /// </summary> /// <param name="url&quo ...

  4. KafkaZookeeper2-ZookeeperClient

    介绍 ZookeeperClient 是 kafka 新写的客户端,它允许用户流水线式(并行)访问 zookeeper. 为什么放弃了 zkClient? zkClient 是一个第三方的客户端. 它 ...

  5. 51nod 1649 齐头并进 (djikstra求最短路径,只用跑一次)

    题目: 这道题有一个坑点:两种交通工具同时出发,中途不能停留在同一个小镇. 其实想通了就很简单,因为要么火车一步到达,要么汽车一步到达.不可能停留在同一个地方. 可是我还WA了好几次,蠢哭.想用BFS ...

  6. 我的Java历程_写出这个数

    lzJava基础进行中,今天偶然间看到的一个题目: 读入一个自然数n,计算其各位数字之和,用汉语拼音写出和的每一位数字.如下代码: import java.util.*;public class Ma ...

  7. schema文件及XML文件的DOM和Sax解析

    schema文件 <?xml version="1.0" encoding="UTF-8"?> <schema xmlns="htt ...

  8. vue单文件中引用路径的处理

    原文地址:vue单文件中引用路径的处理如有错误,欢迎指正! vue单文件的开发过程中,在单文件模版中可能会涉及到文件路径的处理,比如 <img>, style 中的 background ...

  9. Ignatius and the Princess III(杭电1028)(母函数)

    Ignatius and the Princess III Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K ...

  10. ZOJ2326Tangled in Cables(最小生成树)

    Tangled in Cables Time Limit: 2 Seconds      Memory Limit: 65536 KB You are the owner of SmallCableC ...