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 相关文章推荐
Json2Template.js 基于jquery的插件 绑定JavaScript对象到Html模板中
Oct 29 Javascript
jquery创建一个新的节点对象(自定义结构/内容)的好方法
Jan 21 Javascript
开发插件的两个方法jquery.fn.extend与jquery.extend
Nov 21 Javascript
JavaScript如何自定义trim方法
Jul 28 Javascript
Node.js的文件权限及读写flag详解
Oct 11 Javascript
原生js实现回复评论功能
Jan 18 Javascript
bootstrap模态框远程示例代码分享
May 22 Javascript
用Cordova打包Vue项目的方法步骤
Feb 02 Javascript
javascript设计模式 ? 备忘录模式原理与用法实例分析
Apr 21 Javascript
解决vue组件销毁之后计时器继续执行的问题
Jul 21 Javascript
使用JavaScript实现贪吃蛇游戏
Sep 29 Javascript
Javascript实现贪吃蛇小游戏(含详细注释)
Oct 23 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把session写入数据库示例
2014/02/26 PHP
php利用scws实现mysql全文搜索功能的方法
2014/12/25 PHP
PHP判断是手机端还是PC端 PHP判断是否是微信浏览器
2017/03/15 PHP
PHP实现的简单路由和类自动加载功能
2018/03/13 PHP
ThinkPHP3.1.2 使用cli命令行模式运行的方法
2020/04/14 PHP
如何用ajax来创建一个XMLHttpRequest对象
2012/12/10 Javascript
node.js实现BigPipe详解
2014/12/05 Javascript
javascript二维数组转置实例
2015/01/22 Javascript
禁止按回车键提交表单的方法
2015/06/11 Javascript
js实现常用排序算法
2016/08/09 Javascript
基于JavaScript实现前端文件的断点续传
2016/10/17 Javascript
jquery实现手机端单店铺购物车结算删除功能
2017/02/22 Javascript
微信小程序教程系列之设置标题栏和导航栏(7)
2020/06/29 Javascript
关于jquery中attr()和prop()方法的区别
2018/05/28 jQuery
vue项目中添加单元测试的方法
2018/07/21 Javascript
Node.js连接Sql Server 2008及数据层封装详解
2018/08/27 Javascript
解决layui页面按钮点击无反应,也不报错的问题
2019/09/29 Javascript
python 字典(dict)遍历的四种方法性能测试报告
2014/06/25 Python
跟老齐学Python之数据类型总结
2014/09/24 Python
详解Python中__str__和__repr__方法的区别
2015/04/17 Python
python 根据正则表达式提取指定的内容实例详解
2016/12/04 Python
Python 用Redis简单实现分布式爬虫的方法
2017/11/23 Python
Python爬虫天气预报实例详解(小白入门)
2018/01/24 Python
Python 支付整合开发包的实现
2019/01/23 Python
python tkinter canvas使用实例
2019/11/04 Python
python+pygame实现坦克大战小游戏的示例代码(可以自定义子弹速度)
2020/08/11 Python
Python 创建守护进程的示例
2020/09/29 Python
python实现图片,视频人脸识别(dlib版)
2020/11/18 Python
PyQt5中QSpinBox计数器的实现
2021/01/18 Python
日本网路线上商品代购服务:转送JAPAN
2016/08/05 全球购物
GLAMGLOW香港官网:明星出镜前的秘密武器
2017/03/16 全球购物
故意伤害人身损害赔偿协议书
2014/11/19 职场文书
财政局个人年终总结
2015/03/03 职场文书
读书笔记怎么写
2015/07/01 职场文书
pytorch中的numel函数用法说明
2021/05/13 Python
python简单验证码识别的实现过程
2021/06/20 Python