Vue2递归组件实现树形菜单


Posted in Javascript onApril 10, 2017

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

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

Vue2递归组件实现树形菜单

//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可以推断出来。

全代码:

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
写的htc的数据表格
Jan 20 Javascript
使用SyntaxHighlighter实现HTML高亮显示代码的方法
Feb 04 Javascript
DOM事件阶段以及事件捕获与事件冒泡先后执行顺序(图文详解)
Aug 18 Javascript
JavaScript类型系统之基本数据类型与包装类型
Jan 06 Javascript
实例详解JSON数据格式及json格式数据域字符串相互转换
Jan 07 Javascript
Javascript 实现简单计算器实例代码
Oct 23 Javascript
ES2015 Symbol 一种绝不重复的值
Dec 25 Javascript
jquery拖动改变div大小
Jul 04 jQuery
Vue中如何实现轮播图的示例代码
Jul 27 Javascript
基于vue.js的分页插件详解
Nov 27 Javascript
使用vue-router与v-if实现tab切换遇到的问题及解决方法
Sep 07 Javascript
Vue中watch、computed、updated三者的区别及用法
Jul 27 Javascript
JS判断两个对象内容是否相等的方法示例
Apr 10 #Javascript
javascript防篡改对象实例详解
Apr 10 #Javascript
jQuery EasyUI之验证框validatebox实例详解
Apr 10 #jQuery
ES6教程之for循环和Map,Set用法分析
Apr 10 #Javascript
javascript实现动态显示颜色块的报表效果
Apr 10 #Javascript
bootstrap如何让dropdown menu按钮式下拉框长度一致
Apr 10 #Javascript
ES6生成器用法实例分析
Apr 10 #Javascript
You might like
PHP 最大运行时间 max_execution_time修改方法
2010/03/08 PHP
PHP fopen()和 file_get_contents()应用与差异介绍
2014/03/19 PHP
深入浅析PHP7.0新特征(五大新特征)
2015/10/29 PHP
PHP实现通过文本文件统计页面访问量功能示例
2019/02/13 PHP
简单的JS多重继承示例
2008/03/13 Javascript
JavaScript闭包 懂不懂由你反正我是懂了
2011/10/21 Javascript
js弹出的对话窗口永远保持居中显示
2012/12/15 Javascript
jQuery建立一个按字母顺序排列的友好页面索引(兼容IE6/7/8)
2013/02/26 Javascript
可在线编辑网页文字效果代码(单击)
2013/03/02 Javascript
js原生appendChild的bug解决心得分享
2013/07/01 Javascript
枚举的实现求得1-1000所有出现1的数字并计算出现1的个数
2013/09/10 Javascript
关闭时刷新父窗口两种方法
2014/05/07 Javascript
javascript常用的方法分享
2015/07/01 Javascript
利用node.js制作命令行工具方法教程(一)
2017/06/22 Javascript
浅谈JS中的反柯里化( uncurrying)
2017/08/17 Javascript
JS闭包的几种常见形式实例详解
2017/09/16 Javascript
bootstrap 路径导航 分页 进度条的实例代码
2018/08/06 Javascript
如何使用Javascript中的this关键字
2020/05/28 Javascript
[04:27]2014DOTA2国际邀请赛 NAVI战队官方纪录片
2014/07/21 DOTA
python获取指定路径下所有指定后缀文件的方法
2015/05/26 Python
python文件的md5加密方法
2016/04/06 Python
python matplotlib中文显示参数设置解析
2017/12/15 Python
python 批量添加的button 使用同一点击事件的方法
2019/07/17 Python
Tensorflow 实现将图像与标签数据转化为tfRecord文件
2020/02/17 Python
css3实现背景颜色渐变让图片不再是唯一的实现方式
2012/12/18 HTML / CSS
萨克斯第五大道精品百货店: Saks Fifth Avenue
2017/04/28 全球购物
娇韵诗俄罗斯官方网站:Clarins俄罗斯
2020/10/03 全球购物
汽车装潢店创业计划书范文
2014/02/05 职场文书
学生干部学习的自我评价
2014/02/18 职场文书
法律进社区实施方案
2014/03/21 职场文书
二年级班级文化建设方案
2014/05/10 职场文书
医生见习报告范文
2014/11/03 职场文书
教师个人年终总结
2015/02/11 职场文书
辞职书格式样本
2015/02/26 职场文书
使用CSS实现一个搜索引擎的原理解析
2021/09/25 HTML / CSS
React更新渲染原理深入分析
2022/12/24 Javascript