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

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

//js  
//引子
//思想:当v-if=‘false’时,循环时进行的。所以一开始就设置为false。
  ggg:{
      name:'gs',
      template:`
          <div>
            <p @click.stop='show=!show'>我是p标签</p>   //这儿show必须要初始值为false,不然就是堆栈溢出,死循环。
            <gs v-if='show' ></gs>            //这个是循环组件。命名后当函数使。
          </div>
    `,         
}
由于每次递归组件,就相当于实例化了一次组件。所有写在组件data中的值都是该组件专属的。
树状结构:
  我们在父组件给出一个数据,子组件调用这个数据,然后子组件的子组件调用它父组件的数据,如此循环下去。只要数据结构相同,他们调用的方法相同,就行的通。当最后没有子组件的时候,
它不会报错,这个应该是被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可以推断出来。

改变样式: 由于树形结构是相同组件递归出来的,所以,各个组件数据不同,如果要改变某一个选择的样式,就需要全局变量,用bus或者单独js文件+import引入方式可做到全局变量。

全代码:

<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>

vue2 递归组件--树形的更多相关文章

  1. Vue.js 递归组件实现树形菜单

    最近看了 Vue.js 的递归组件,实现了一个最基本的树形菜单. 项目结构: main.js 作为入口,很简单: import Vue from 'vue' Vue.config.debug = tr ...

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

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

  3. Vue.js递归组件实现动态树形菜单

    使用Vue递归组件实现动态菜单 现在很多项目的菜单都是动态生成的,之前自己做项目也是遇到这种需求,翻看了官网案例,和网上大神的案例.只有两个感觉,官网的案例太简洁,没有什么注释,看起来不太好理解,大神 ...

  4. vue之递归组件实现树形目录

    递归组件的应用===>可以通过组件命名来自己使用自己的组件 实例如下 父组件 <div class="content"> <detail-list :lis ...

  5. VUE递归树形目录(vue递归组件)的使用

    1.html <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" ...

  6. vue递归组件 (树形控件 )

    首先我们要知道,既然是递归组件,那么一定要有一个结束的条件,否则就会使用组件循环引用,最终出现“max stack size exceeded”的错误,也就是栈溢出.那么,我们可以使用v-if=&qu ...

  7. vuejs递归组件

    vuejs学习--递归组件   前言 学习vue有一段时间了,最近使用vue做了一套后台管理系统,其中使用最多就是递归组件,也因为自己对官方文档的不熟悉使得自己踩了不少坑,今天写出来和大家一起分享. ...

  8. vuejs学习--递归组件(树型表格分享)

    前言 学习vue有一段时间了,最近使用vue做了一套后台管理系统,其中使用最多就是递归组件,也因为自己对官方文档的不熟悉使得自己踩了不少坑,今天写出来和大家一起分享. 递归组件 组件在它的模板内可以递 ...

  9. Vue中的递归组件

    递归函数我们都再熟悉不过了,也就是函数自己调用自己.递归组件也是类似的,在组件的template内部使用组件自身.那递归组件有什么使用场景呢? 我们都知道树这个数据结构就是一种递归的结构,因此我们可以 ...

随机推荐

  1. QT的radioButton组的使用

    在使用Qt的radioButton控件时,会产生一个疑问,如何让你选择的那个radio得到一个数据,进行判断,网上的一些资料有些不全,容易出错. 所以你得做件事,给每个radioButton进行赋初值 ...

  2. tensorflow 安装升级

    对于已经安装过的tensorflow,执行以下命令升级到最新版: pip3 install -U tensorflow 目前最新版本1.4

  3. zuul超时的解决方案

    参考http://www.coolxuewang.com/view/10 在zuul的配置文件里增加如下配置: ribbon:    ConnectTimeout: 6000    ReadTimeo ...

  4. Golang 探索对Goroutine的控制方法

    前言 在golang中,只需要在函数调用前加上关键字go即可创建一个并发任务单元,而这个新建的任务会被放入队列中,等待调度器安排.相比系统的MB级别线程栈,goroutine的自定义栈只有2KB,这使 ...

  5. JAVA9模块化详解(一)——模块化的定义

    JAVA9模块化详解 前言 java9已经出来有一段时间了,今天向大家介绍一下java9的一个重要特性--模块化.模块化系统的主要目的如下: 更可靠的配置,通过制定明确的类的依赖关系代替以前那种易错的 ...

  6. Sagit.Framework For IOS 开发框架入门教程3:Start引导页及框架布局和隐藏事件的内幕

    前言: 框架依旧在快速更新着:在重构.简化代码,统一标准的过程中. 中间也遇到各种坑,不过好在一步一脚印的解决了. 虽然还有些功能还在思考,不过教程,还是得补上: 上篇文章:Sagit.Framewo ...

  7. 用shell制作IP脚本

    vim  ip.sh #!/bin/bashread -p "eth:" eread -p "ip:" ip1read -p "netmask:&qu ...

  8. Java开发小技巧(四):配置文件敏感信息处理

    前言 不知道在上一篇文章中你有没有发现,jdbc.properties中的数据库密码配置是这样写的: jdbc.password=5EF28C5A9A0CE86C2D231A526ED5B388 其实 ...

  9. 使用AOP记录应用调用链开销

    最近系统出现了一次线上的性能问题,本来以为目前的QPS应该是不会出现任何问题的,结果微服务还是比较容易因为某个点的问题导致雪崩的...出了性能问题就要做分析,正统的思路是要不断进行压测用JProfil ...

  10. nginx防恶意域名解析

    今天无意间查看访问日志发现一个fhxywh.com的域名居然解析到了我的服务器,也就是说通过这个域名也能访问我的博客,这个就是赤裸裸的恶意域名解析了. 这个危害非常大,不仅会影响用户,而且不利于SEO ...