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 相关文章推荐
firefo xml 读写实现js代码
Jun 11 Javascript
jquery中EasyUI实现同步树
Mar 01 Javascript
Backbone.js的一些使用技巧
Jul 01 Javascript
jquery实现左右无缝轮播图
Jul 31 Javascript
javascript正则表达式之分组概念与用法实例
Jun 16 Javascript
JS验证 只能输入小数点,数字,负数的实现方法
Oct 07 Javascript
D3.js实现文本的换行详解
Oct 14 Javascript
深入理解Angularjs中$http.post与$.post
May 19 Javascript
js学使用setTimeout实现轮循动画
Jul 17 Javascript
vue做移动端适配最佳解决方案(亲测有效)
Sep 04 Javascript
JS表格的动态操作完整示例
Jan 13 Javascript
Vue.js暴露方法给WebView的使用操作
Sep 07 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和MySql来与ODBC数据连接
2006/10/09 PHP
Bo-Blog专用的给Windows服务器的IIS Rewrite程序
2007/08/26 PHP
深入PHP许愿墙模块功能分析
2013/06/25 PHP
PHP不用递归实现无限分级的例子分享
2014/04/18 PHP
浅谈php和.net的区别
2014/09/28 PHP
php中socket的用法详解
2014/10/24 PHP
浅谈PHP命令执行php文件需要注意的问题
2016/12/16 PHP
php实现文件与16进制相互转换的方法示例
2017/02/16 PHP
Laravel框架基于中间件实现禁止未登录用户访问页面功能示例
2019/01/17 PHP
Laravel 框架路由原理与路由访问实例分析
2020/04/14 PHP
在视频前插入广告
2006/11/20 Javascript
jQuery.clean使用方法及思路分析
2013/01/07 Javascript
Nodejs实现的一个静态服务器实例
2014/12/06 NodeJs
javascript实现单击和双击并存的方法
2014/12/13 Javascript
Javascript 多物体运动的实现
2014/12/24 Javascript
javascript实现图片轮播效果
2016/01/20 Javascript
去除字符串左右两边的空格(实现代码)
2016/05/12 Javascript
jquery实现的回旋滚动效果完整实例【附demo源码下载】
2016/09/20 Javascript
JavaScript面试题大全(推荐)
2016/09/22 Javascript
微信小程序 时间格式化(util.formatTime(new Date))详解
2016/11/16 Javascript
mui 打开新窗口的方式总结及注意事项
2017/08/20 Javascript
使用socket.io制做简易WEB聊天室
2018/01/02 Javascript
vue :src 文件路径错误问题的解决方法
2018/05/15 Javascript
基于webpack4.X从零搭建React脚手架的方法步骤
2018/12/23 Javascript
vue限制输入框只能输入8位整数和2位小数的代码
2019/11/06 Javascript
[05:08]2014DOTA2国际邀请赛 Hao专访复仇的胜利很爽
2014/07/15 DOTA
Python实现线程池代码分享
2015/06/21 Python
python opencv实现旋转矩形框裁减功能
2018/07/25 Python
详解Python图像处理库Pillow常用使用方法
2019/09/02 Python
使用Pytorch来拟合函数方式
2020/01/14 Python
python线程池 ThreadPoolExecutor 的用法示例
2020/10/10 Python
Jabra捷波朗美国官网:用于办公、车载和运动的无线蓝牙耳麦
2017/02/01 全球购物
升职感谢信
2015/01/22 职场文书
自主招生自荐信范文
2015/03/04 职场文书
入伍通知书
2015/04/23 职场文书
MySQL数据库表约束讲解
2022/06/21 MySQL