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 相关文章推荐
找到一点可怜的关于dojo资料,谢谢作者!
Dec 06 Javascript
基于jQuery的js分页代码
Jun 10 Javascript
IE6下js通过css隐藏select的一个bug
Aug 16 Javascript
Jquery + Ajax调用webService实例代码(asp.net)
Aug 27 Javascript
一个javascript图片阅览组件
Nov 09 Javascript
浅谈Javascript鼠标和滚轮事件
Jun 27 Javascript
JS判断页面加载状态以及添加遮罩和缓冲动画的代码
Oct 11 Javascript
js实现简洁的TAB滑动门效果代码
Sep 06 Javascript
vue通过watch对input做字数限定的方法
Jul 13 Javascript
js HTML5 canvas绘制图片的方法
Sep 08 Javascript
Node.js readline 逐行读取、写入文件内容的示例
Mar 01 Javascript
关于微信小程序map组件z-index的层级问题分析
Jul 09 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 4.2书写安全的脚本
2006/10/09 PHP
php 多关键字 高亮显示实现代码
2012/04/23 PHP
使用PHP如何实现高效安全的ftp服务器(一)
2015/12/20 PHP
WordPress开发中用于获取近期文章的PHP函数使用解析
2016/01/05 PHP
PHP设计模式之工厂模式详解
2017/10/24 PHP
Yii2结合Workerman的websocket示例详解
2018/09/10 PHP
PHP实现单例模式建立数据库连接的方法分析
2020/02/11 PHP
Javascript调试工具(下载)
2007/01/09 Javascript
javascript 常用关键字列表集合
2007/12/04 Javascript
javascript新手语法小结
2008/06/15 Javascript
JavaScript 命名空间 使用介绍
2013/08/29 Javascript
Jquery设置attr的disabled属性控制某行显示或者隐藏
2014/09/25 Javascript
js拆分字符串并将分割的数据放到数组中的方法
2015/05/06 Javascript
JavaScript+html5 canvas实现图片破碎重组动画特效
2016/02/22 Javascript
浅谈JS原生Ajax,GET和POST
2016/06/08 Javascript
AngularJs  Using $location详解及示例代码
2016/09/02 Javascript
Vue中添加过渡效果的方法
2017/03/16 Javascript
解决ionic和angular上拉加载的问题
2017/08/03 Javascript
详解js location.href和window.open的几种用法和区别
2019/12/02 Javascript
[10:39]DOTA2上海特级锦标赛音乐会纪录片
2016/03/21 DOTA
Python和GO语言实现的消息摘要算法示例
2015/03/10 Python
Python用list或dict字段模式读取文件的方法
2017/01/10 Python
python多线程socket编程之多客户端接入
2017/09/12 Python
Django基于ORM操作数据库的方法详解
2018/03/27 Python
Python中应该使用%还是format来格式化字符串
2018/09/25 Python
用vue.js组件模拟v-model指令实例方法
2019/07/05 Python
Python Django中间件使用原理及流程分析
2020/06/13 Python
Python接口测试环境搭建过程详解
2020/06/29 Python
英国最大的在线快递公司之一:ParcelHero
2019/11/04 全球购物
Java的类可以定义为Protected或者Private得吗
2015/09/25 面试题
三个Unix的命令面试题
2015/04/12 面试题
大一学生假期实习的自我评价
2013/10/12 职场文书
研究生考核个人自我鉴定
2014/03/27 职场文书
就业协议书的作用
2014/04/11 职场文书
市场策划求职信
2014/08/07 职场文书
门市房租房协议书
2014/12/04 职场文书