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 相关文章推荐
优秀js开源框架-jQuery使用手册(1)
Mar 10 Javascript
javascript+css 网页每次加载不同样式的实现方法
Dec 27 Javascript
40款非常棒的jQuery 插件和制作教程(系列一)
Oct 26 Javascript
Javascript面向对象设计一 工厂模式
Dec 20 Javascript
jquery ajax应用中iframe自适应高度问题解决方法
Apr 12 Javascript
JavaScript中实现继承的三种方式和实例
Jan 29 Javascript
javascript中Array数组的迭代方法实例分析
Feb 04 Javascript
JavaScript实现的简单拖拽效果
Jun 01 Javascript
基于JavaScript实现Json数据根据某个字段进行排序
Nov 24 Javascript
javascript实现最长公共子序列实例代码
Feb 05 Javascript
Node.js之删除文件夹(含递归删除)代码实例
Sep 09 Javascript
layui复选框限制选择个数的方法
Sep 18 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 GD绘制24小时柱状图
2008/06/28 PHP
深入解析php中的foreach问题
2013/06/30 PHP
php+highchats生成动态统计图
2014/05/21 PHP
javascript的键盘控制事件说明
2008/04/15 Javascript
JavaScript判断变量是否为undefined的两种写法区别
2013/12/04 Javascript
JS常用表单验证方法总结
2014/05/22 Javascript
关于JavaScript命名空间的一些心得
2014/06/07 Javascript
js中取得变量绝对值的方法
2015/01/03 Javascript
跟我学习javascript的prototype使用注意事项
2015/11/17 Javascript
webpack+vue.js快速入门教程
2016/10/12 Javascript
JS中去掉array中重复元素的方法
2017/05/26 Javascript
简单明了区分escape、encodeURI和encodeURIComponent
2018/05/26 Javascript
一个Vue视频媒体多段裁剪组件的实现示例
2018/08/09 Javascript
原生js通过一行代码实现简易轮播图
2019/06/05 Javascript
jquery使用echarts实现有向图可视化功能示例
2019/11/25 jQuery
微信域名检测接口调用演示步骤(含PHP、Python)
2019/12/08 Javascript
Python3.x中自定义比较函数
2015/04/24 Python
基于进程内通讯的python聊天室实现方法
2015/06/28 Python
python使用正则表达式替换匹配成功的组
2017/11/17 Python
Python实现螺旋矩阵的填充算法示例
2017/12/28 Python
python 对dataframe下面的值进行大规模赋值方法
2018/06/09 Python
解决python读取几千万行的大表内存问题
2018/06/26 Python
Python Numpy库安装与基本操作示例
2019/01/08 Python
解决使用PyCharm时无法启动控制台的问题
2019/01/19 Python
python三大神器之fabric使用教程
2019/06/10 Python
pycharm显示远程图片的实现
2019/11/04 Python
Python使用扩展库pywin32实现批量文档打印实例
2020/04/09 Python
JAVA及PYTHON质数计算代码对比解析
2020/06/10 Python
HTML5 Canvas像素处理使用接口介绍
2012/12/02 HTML / CSS
HTML5新增属性data-*和js/jquery之间的交互及注意事项
2017/08/08 HTML / CSS
编写类String 的构造函数、析构函数和赋值函数
2012/09/09 面试题
英语老师推荐信
2014/02/26 职场文书
基层党组织建设整改方案
2014/09/16 职场文书
房屋买卖委托书格式范本格式
2014/10/13 职场文书
机关保密工作承诺书
2015/05/04 职场文书
机关干部作风整顿心得体会
2016/01/22 职场文书