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下4个跨浏览器必备的函数
Mar 07 Javascript
jquery幻灯片插件bxslider样式改进实例
Oct 15 Javascript
Javascript 运动中Offset的bug解决方案
Dec 24 Javascript
JavaScript中toString()方法的使用详解
Jun 05 Javascript
js实现当复选框选择匿名登录时隐藏登录框效果
Aug 14 Javascript
第七章之菜单按钮图标组件
Apr 25 Javascript
Javascript中判断一个值是否为undefined的方法详解
Sep 28 Javascript
浅谈jQuery this和$(this)的区别及获取$(this)子元素对象的方法
Nov 29 Javascript
漂亮实用的页面loading(加载)封装代码
Feb 03 Javascript
在Vue组件上动态添加和删除属性方法
Feb 23 Javascript
Node.js静态服务器的实现方法
Feb 28 Javascript
React 无状态组件(Stateless Component) 与高阶组件
Aug 14 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
WordPress中用于获取搜索表单的PHP函数使用解析
2016/01/05 PHP
php获取数据库中数据的实现方法
2017/06/01 PHP
PHP基于递归实现的约瑟夫环算法示例
2017/08/27 PHP
PHP判断是否是微信打开,浏览器打开的方法
2018/03/14 PHP
Laravel相关的一些故障解决
2020/08/19 PHP
Array.slice()与Array.splice()的返回值类型
2006/10/09 Javascript
使用自定义setTimeout和setInterval使之可以传递参数和对象参数
2009/04/24 Javascript
javascript中类的定义及其方式(《javascript高级程序设计》学习笔记)
2011/07/04 Javascript
在firefox和Chrome下关闭浏览器窗口无效的解决方法
2014/01/16 Javascript
jQuery调用RESTful WCF示例代码(GET方法/POST方法)
2014/01/26 Javascript
js 通过html()及text()方法获取并设置p标签的显示值
2014/05/14 Javascript
在JavaScript中访问字符串的子串
2015/07/07 Javascript
javascript 将共享属性迁移到原型中去的实现方法
2016/08/31 Javascript
JS中跨页面调用变量和函数的方法(例如a.js 和 b.js中互相调用)
2016/11/01 Javascript
Vue 固定头 固定列 点击表头可排序的表格组件
2016/11/25 Javascript
vue2.0中goods选购栏滚动算法的实现代码
2017/05/17 Javascript
Angular4实现动态添加删除表单输入框功能
2017/08/11 Javascript
微信小程序实现倒计时调用相机自动拍照功能
2018/06/10 Javascript
JS获取月的第几周和年的第几周实例代码
2018/12/05 Javascript
vue中将html字符串转换成html后遇到的问题小结
2018/12/10 Javascript
使用post方法实现json往返传输数据的方法
2019/03/30 Javascript
VUE 动态组件的应用案例分析
2019/12/02 Javascript
手把手带你入门微信小程序新框架Kbone的使用
2020/02/25 Javascript
js实现头像上传并且可预览提交
2020/12/25 Javascript
pymssql ntext字段调用问题解决方法
2008/12/17 Python
在Linux下使用Python的matplotlib绘制数据图的教程
2015/06/11 Python
Python 正则表达式入门(初级篇)
2016/12/07 Python
几行Python代码爬取3000+上市公司的信息
2019/01/24 Python
浅析python redis的连接及相关操作
2019/11/07 Python
PHP中如何创建和修改数组
2012/05/02 面试题
会计电算化专业应届大学生求职信
2013/10/22 职场文书
项目建议书范文
2014/05/12 职场文书
《狼王梦》读后感:可怜天下父母心
2019/11/01 职场文书
Python深度学习之Pytorch初步使用
2021/05/20 Python
python爬取网页版QQ空间,生成各类图表
2021/06/02 Python
利用Python将list列表写入文件并读取的方法汇总
2022/03/25 Python