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学习笔记(三)BOM和DOM详解
Sep 30 Javascript
Node.js中的模块机制学习笔记
Nov 04 Javascript
js实现非常简单的焦点图切换特效实例
May 07 Javascript
JS+CSS简单树形菜单实现方法
Sep 12 Javascript
Bootstrap项目实战之子栏目资讯内容
Apr 25 Javascript
javascript中利用柯里化函数实现bind方法
Apr 29 Javascript
JS中sort函数排序用法实例分析
Jun 16 Javascript
Bootstrap table两种分页示例
Dec 23 Javascript
Vue2.0用 watch 观察 prop 变化(不触发)
Sep 08 Javascript
基于Vue过渡状态实例讲解
Sep 14 Javascript
JavaScript闭包原理与用法实例分析
Aug 10 Javascript
vue  directive定义全局和局部指令及指令简写
Nov 20 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源代码
2009/08/21 PHP
PHP那些琐碎的知识点(整理)
2017/05/20 PHP
php array_map()函数实例用法
2021/03/03 PHP
JAVASCRIPT IE 与 FF中兼容问题小结
2009/02/18 Javascript
javascript GUID生成器实现代码
2009/10/31 Javascript
JavaScript Date对象 日期获取函数
2010/12/19 Javascript
node.js中的console.warn方法使用说明
2014/12/09 Javascript
移动手机APP手指滑动切换图片特效附源码下载
2015/11/30 Javascript
老生常谈遮罩层 滚动条的问题
2016/04/29 Javascript
BootStrap Table 分页后重新搜索问题的解决办法
2016/08/08 Javascript
jQuery实现移动端手机商城购物车功能
2016/09/24 Javascript
Bootstrap 填充Json数据的实例代码
2017/01/11 Javascript
JavaScript中值类型和引用类型的区别
2017/02/23 Javascript
深入理解在JS中通过四种设置事件处理程序的方法
2017/03/02 Javascript
微信小程序图片选择、上传到服务器、预览(PHP)实现实例
2017/05/11 Javascript
基于Vue制作组织架构树组件
2017/12/06 Javascript
vue2.0 循环遍历加载不同图片的方法
2018/03/06 Javascript
原生js通过一行代码实现简易轮播图
2019/06/05 Javascript
微信小程序开发之获取用户手机号码(php接口解密)
2020/05/17 Javascript
vue v-model的用法解析
2020/10/19 Javascript
ReactRouter的实现方法
2021/01/25 Javascript
Python进阶篇之字典操作总结
2016/11/16 Python
详解Python各大聊天系统的屏蔽脏话功能原理
2016/12/01 Python
Python中GeoJson和bokeh-1的使用讲解
2019/01/03 Python
如何在Django项目中引入静态文件
2019/07/26 Python
Python Multiprocessing多进程 使用tqdm显示进度条的实现
2019/08/13 Python
Python中的 ansible 动态Inventory 脚本
2020/01/19 Python
Python命令行参数定义及需要注意的地方
2020/11/30 Python
HTML5单页面手势滑屏切换原理分析
2017/07/10 HTML / CSS
质检部岗位职责
2013/11/11 职场文书
经销商培训邀请函
2014/01/21 职场文书
环保建议书
2014/03/12 职场文书
应届生求职信范文
2014/06/30 职场文书
国庆节促销广告语2014
2014/09/19 职场文书
先进教师个人总结
2015/02/11 职场文书
Java 写一个简单的图书管理系统
2022/04/26 Java/Android