vue2 递归组件--树形学习分享

今天看了老长时间递归组件,官方给的教程太简便了,根本看不出到底怎么用。于是自己查网摸索了一下,这儿只把核心思想写出来。

效果如下图,点击后打开二级菜单,再点击后打开三级。

//js  //引子aaa:{ //组件名字aaa,挂载到components中的。                                  
    name:‘aa‘,
    template:`
      <div>组件</div>
      <aa></aa>`     //其实这儿就已经是递归调用了,只要在html中使用但是会无限循环下去。所以就需要一个结束点。这个结束点怎么给?           }
由于每次递归组件,就相当于实例化了一次组件。所有写在组件data中的值都是该组件专属的,并不共有,所以在组件数据中设置flag或者其他,那是行不通的。其实递归组件正真的用法就是做树状结构用的。做法如下:  我们在父组件给出一个数据,子组件调用这个数据,然后子组件的子组件调用它父组件的数据,如此循环下去。只要数据结构相同,他们调用的方法相同,就行的通。当最后没有子组件的时候,它不会报错,这个应该是被vue优化了。

思想:递归调用某个组件,而这个组件的作用就是解析出此层的数据。因此数据的格式就有技巧:

msg:[{//对此数组遍历。                                                                                                                      js
     text:1,  //第一层数据 ,要显示1,就要对顶层text遍历,xxx.text就得到1。点击‘1’弹出1-1就需要将父组件的xxx.next传给子组件。
     next:[{
         text:‘1-1‘,//第二层数据
         next:[{
            text:‘1-1-1‘,//第三层数据
            next:[{
                text:‘1-1-1-1‘,
            }]
         }]
     }]
  },{
      text:2,  //第一层数据
  },{
    text:3,   //第一层数据
  }]
//html

  <div>

  <ggg :msg=‘msg‘></ggg> //这儿写在父组件模板中。

 </div>

//js

ggg:{

name:‘gs‘,// 这儿必须起个名字,这个名字其实就是构造函数的名字。没有名字无法递归组件。

template:`// 构造函数的return值,模板。

<ul >

      <li v-for=‘a in text‘

{{a.text}}//第一次1、2、3;第二次 1-1 ,第三次1-1-1,第四次1-1-1-1

<gs :msg=‘a.next‘></gs> // 这儿递归用组件(构造函数),代码运行到这儿时会返回去调用。这儿有个很重要的操作,将这一层的a.text数据传到下一层去,并且改为text

</li>

</ul>`,

props:[‘msg‘],//这个是接收父组件过的值

}

到此基本概念已经齐全了。

点击1 出现1-1:

<li v-for=‘a in msg‘ @click.stop.self=‘show=!show‘>// 在li标签添加一个点击事件,改变show的值。

  {{a.text}}

  <gs :msg=‘a.next‘ v-if=‘show‘ ></gs>         //官网上说了,这儿是show为true才会递归。就是解析下一次数据。

</li>       

点击1想出现1-2:修改data的值,从顶层数据出现1 2 3可以推断出来。

全代码:

<template >

<div>

<ggg :msg=‘msg‘></ggg> //组件使用 父组件传msg 子组件接收(:msg)

</div>

</template>

<script>

export default {  //这儿用的脚手架,若是普通文件,这儿就是new Vue({})

data(){

return {

msg:[{

text:1,

next:[{

text:‘1-1‘,

next:[{

text:‘1-1-1‘,

next:[{

text:‘1-1-1-1‘,

}]

}]

},{

text:‘1-2‘ //1-2写在这儿,第二层数据数组中的a[1].text就是‘1-2’

}]

},{

text:2,

},{

text:3,

}]

}

},

components:{

ggg:{

name:‘gs‘,

template:`

<ul >

<li v-for=‘a in msg‘ @click.stop.self=‘show=!show‘>

{{a.text}}

<gs :msg=‘a.next‘ v-if=‘show‘ ></gs>

</li>

</ul>`,

props:[‘msg‘],

data(){

return {

show:false

}

}

}

}

}

</script>

时间: 2024-08-06 19:44:07

vue2 递归组件--树形学习分享的相关文章

vue递归组件 (树形控件 )

首先我们要知道,既然是递归组件,那么一定要有一个结束的条件,否则就会使用组件循环引用,最终出现“max stack size exceeded”的错误,也就是栈溢出.那么,我们可以使用v-if="判断条件"作为递归组件的结束条件.当遇到v-if为false时,组件将不会再进行渲染 1. 准备一个树状的递归数据 navigation: [ { types: 1, id: "0", name: "首页", path: "/jiaowu_sy

vuejs递归组件

vuejs学习--递归组件 前言 学习vue有一段时间了,最近使用vue做了一套后台管理系统,其中使用最多就是递归组件,也因为自己对官方文档的不熟悉使得自己踩了不少坑,今天写出来和大家一起分享. 递归组件 组件在它的模板内可以递归地调用自己,只有当它有 name 选项时才可以. 在官网这句话就是关键定义组件是一定要有name属性.按照这个思路我们开动吧. 实现最终效果图: 模拟数据格式如下: var data = [{ "id": "1", "data&q

Vue组件的操作-自定义组件,动态组件,递归组件

作者 | Jeskson 来源 | 达达前端小酒馆 v-model双向绑定 创建双向数据绑定,v-model指令用来在input,select,checkbox,radio等表单控件.v-model指令在内部使用不同的属性为不同的输入元素抛出不同的事件. v-mdel指令实现数据的双向绑定: <div> 用户名:<input type="text" v-model="name"> </div> 输入用户名是:{{name}} &l

递归组件

递归组件 组件在它的模板内可以递归地调用自己,只有当它有 name 选项时才可以. 在官网这句话就是关键定义组件是一定要有name属性.按照这个思路我们开动吧. 实现最终效果图: 模拟数据格式如下: var data = [{ "id": "1", "data": { "menuName": "项目管理", "menuCode": "", }, "child

谈谈Vue的递归组件

2月最后一天,而且还四年一遇,然而本月居然一篇博客没写,有点说不过去.所以,今天就来谈谈Vue的递归组件.我们先来看一个例子: See the Pen 递归组件 by imgss (@imgss) on CodePen. 什么是递归组件 上面这个例子,就是用递归组件实现的.递归组件,顾名思义,就是自己的内部实现又调用自己的组件.比如Vue官方给的treeView的例子,父目录下有子目录,子目录下还有子目录,子子孙孙,无穷尽也.就像俄罗斯套娃. 代码结构大概长下面这样子,需要注意递归组件与一般组件

Swagger框架学习分享

Swagger框架学习分享 转至元数据结尾 Created and last modified by 刘新宇 大约1分钟以前 转至元数据起始 一.背景介绍 1.1.项目简介 1.2.code repository 1.3.演示项目 二.开发准备 2.1.环境准备 2.2.项目搭建 2.2.1.jar仓库 2.2.2.相关依赖 2.2.3.编写配置文件 2.2.4.与swagger-ui集成 2.6.5.Controller配置 2.2.6.启动中间件 2.2.7.需求定制 三.学习感想 一.背景

通信vue2.0组件

vue2.0组件通信各种情况总结与实例分析 Props在vue组件中各种角色总结 在Vue中组件是实现模块化开发的主要内容,而组件的通信更是vue数据驱动的灵魂,现就四种主要情况总结如下: 使用props传递数据---组件内部 //html <div id="app1"> <i>注意命名规定:仅在html内使用my-message</i> <child my-message="组件内部数据传递"></child&

1、Kafka学习分享-V1.0

Kafka学习分享 .1       什么是Kafka Apache Kafka是一个开源的流处理平台,由 Apache Software Foundation使用Scala and Java编写发展而来.Kafka?用于构建实时数据管道和流媒体应用. 它具有水平可扩展性,容错性,快速性,并在数千家公司生产中运行. 它的主要功能:数据流的发布和订阅.数据流的处理.数据流的存储.像一个消息系统一样发布和订阅数据流,有效且实时地处理数据流,在一个分布式备份的集群中安全地处理存储数据流. .2    

敏捷开发学习分享

程序员都很懒,你懂的! 敏捷不是快,而是拥抱变化(不断反馈的一个过程). 简单的说,敏捷开发是一种以人为核心.迭代.循序渐进的开发方法.在敏捷开发中,软件项目的构建被切分成多个子项目,各个子项目的成果都经过测试,具备集成和可运行的特征.换言之,就是把一个大项目分为多个相互联系,但也可独立运行的小项目,并分别完成,在此过程中软件一直处于可使用状态. 敏捷原则:主张简单,拥抱变化,可持续性,快速反馈,轻装前进. 敏捷思维:让开发过程轻量化(我们不是软件工厂).经验性过程更适合软件项目,需求是涌现式的