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 相关文章推荐
jQuery学习总结之元素的相对定位和选择器(持续更新)
Apr 26 Javascript
JavaScript:Div层拖动效果实例代码
Aug 06 Javascript
js阻止事件追加的具体实现
Oct 15 Javascript
TypeScript具有的几个不同特质
Apr 07 Javascript
Bootstrap精简教程中秋大放送
Sep 15 Javascript
jquery中绑定事件的异同
Feb 28 Javascript
JavaScript输入框字数实时统计更新
Jun 17 Javascript
Angular2生命周期钩子函数的详细介绍
Jul 10 Javascript
jQuery上传插件webupload使用方法
Aug 01 jQuery
mpvue项目中使用第三方UI组件库的方法
Sep 30 Javascript
js判断在哪个浏览器打开项目的方法
Jan 21 Javascript
react 生命周期实例分析
May 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中防止直接访问或查看或下载config.php文件的方法
2012/07/07 PHP
修改Laravel5.3中的路由文件与路径
2016/08/10 PHP
PHP+ajax实现上传、删除、修改单张图片及后台处理逻辑操作详解
2020/02/12 PHP
Yii框架安装简明教程
2020/05/15 PHP
用javascript获得地址栏参数的两种方法
2006/11/08 Javascript
jquery 学习之二 属性(类)
2010/11/25 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(四)用地图块拼成大地图
2013/01/23 Javascript
js中用window.open()打开多个窗口的name问题
2014/03/13 Javascript
jquery实现select选中行、列合计示例
2014/04/25 Javascript
判断在css加载完毕后执行后续代码示例
2014/09/03 Javascript
js生成随机颜色方法代码分享(三种)
2016/12/29 Javascript
Base64(二进制)图片编码解析及在各种浏览器的兼容性处理
2017/02/09 Javascript
浅谈struts1 &amp; jquery form 文件异步上传
2017/05/25 jQuery
简单谈谈vue的过渡动画(推荐)
2017/10/11 Javascript
原生JS使用Canvas实现拖拽式绘图功能
2019/06/05 Javascript
浅谈vuex的基本用法和mapaction传值问题
2019/11/08 Javascript
微信小游戏中three.js离屏画布的示例代码
2020/10/12 Javascript
[03:04]DOTA2英雄基础教程 影魔
2013/12/11 DOTA
[02:36]DOTA2上海特锦赛 回忆电竞生涯的重要瞬间
2016/03/25 DOTA
python实现简单温度转换的方法
2015/03/13 Python
python实现简单神经网络算法
2018/03/10 Python
python实现日常记账本小程序
2018/03/10 Python
用pycharm开发django项目示例代码
2019/06/13 Python
python+opencv实现车牌定位功能(实例代码)
2019/12/24 Python
python入门教程之基本算术运算符
2020/11/13 Python
英国独特礼物想法和个性化礼物网站:notonthehighstreet.com
2018/04/16 全球购物
英语专业个人求职信范文
2014/02/01 职场文书
大学生通用个人的自我评价
2014/02/10 职场文书
办公室主任岗位承诺书
2014/05/29 职场文书
毕业生应聘求职信
2014/07/10 职场文书
教师党员个人自我剖析材料
2014/09/29 职场文书
志愿者服务宣传标语口号
2015/12/26 职场文书
党组织结对共建协议书
2016/03/23 职场文书
Python深度学习之实现卷积神经网络
2021/06/05 Python
Python+Selenium实现抖音、快手、B站、小红书、微视、百度好看视频、西瓜视频、微信视频号、搜狐视频、一点号、大风号、趣头条等短视频自动发布
2022/04/13 Python
mysql查看表结构的三种方法总结
2022/07/07 MySQL