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 相关文章推荐
JavaScript 不只是脚本
May 30 Javascript
JavaScript的类型转换(字符转数字 数字转字符)
Aug 30 Javascript
PHP中CURL的几个经典应用实例
Jan 23 Javascript
jQuery实现的在线答题功能
Apr 12 Javascript
jQuery插件pagewalkthrough实现引导页效果
Jul 05 Javascript
js简单实现标签云效果实例
Aug 06 Javascript
Bootstrap源码解读媒体对象、列表组和面板(10)
Dec 26 Javascript
JS检测数组类型的方法小结
Mar 14 Javascript
vue跨域解决方法
Oct 15 Javascript
Vue-resource拦截器判断token失效跳转的实例
Oct 27 Javascript
JS中自定义事件的使用与触发操作实例分析
Nov 01 Javascript
jQuery 移除事件的方法
Jun 20 jQuery
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桌面中心(四) 数据显示
2007/03/11 PHP
php类自动加载器实现方法
2015/07/28 PHP
在laravel中实现将查询的对象转换为多维数组的函数
2019/10/21 PHP
JS处理VBArray的函数使用说明
2008/05/11 Javascript
IE与firefox之jquery用法区别
2008/10/03 Javascript
jquery 操作DOM的基本用法分享
2012/04/05 Javascript
Javascript Ajax异步读取RSS文档具体实现
2013/12/12 Javascript
简述AngularJS的控制器的使用
2015/06/16 Javascript
jQuery文字横向滚动效果的实现代码
2016/05/31 Javascript
js简单获取表单中单选按钮值的方法
2016/08/23 Javascript
jquery.zclip轻量级复制失效问题
2017/01/08 Javascript
js正则表达式验证表单【完整版】
2017/03/06 Javascript
C#微信小程序服务端获取用户解密信息实例代码
2017/03/10 Javascript
Vue生命周期示例详解
2017/04/12 Javascript
jquery实现tab选项卡切换效果(悬停、下方横线动画位移)
2017/05/05 jQuery
JavaScript数据结构之单链表和循环链表
2017/11/28 Javascript
Angular 项目实现国际化的方法
2018/01/08 Javascript
vue路由导航守卫和请求拦截以及基于node的token认证的方法
2019/04/07 Javascript
使用React手写一个对话框或模态框的方法示例
2019/04/25 Javascript
js常见遍历操作小结
2019/06/06 Javascript
vue中keep-alive,include的缓存问题
2019/11/26 Javascript
vant 解决tab切换插件标题样式自定义的问题
2020/11/13 Javascript
Python计时相关操作详解【time,datetime】
2017/05/26 Python
python flask框架实现传数据到js的方法分析
2019/06/11 Python
django-allauth入门学习和使用详解
2019/07/03 Python
通过Python编写一个简单登录功能过程解析
2019/09/04 Python
使用OpenCV-python3实现滑动条更新图像的Canny边缘检测功能
2019/12/12 Python
Python 操作 PostgreSQL 数据库示例【连接、增删改查等】
2020/04/21 Python
详解pytorch tensor和ndarray转换相关总结
2020/09/03 Python
python 进制转换 int、bin、oct、hex的原理
2021/01/13 Python
CSS3基础(RGBa、text-shadow、box-shadow、border-radius)
2012/11/13 HTML / CSS
澳大利亚玩具剧场:Toy Playhouse
2019/03/03 全球购物
九年级历史教学反思
2014/01/27 职场文书
物流管理专业自荐信
2014/06/23 职场文书
2014年企业员工工作总结
2014/12/09 职场文书
护士医德医风心得体会
2016/01/25 职场文书