自己做个小项目练手,需要用到组件递归,网上查了一些资料,每个代码片段都认识,但是连起来,就一团浆糊。

既然人傻就多思考吧。不明白的点有以下:

1.组件怎么自己调用自己,函数的递归是就是在function fn(){ fn() },组件的递归没有看到这样子的呀。

答:组件中使用name属性,给组件自己定义个名字,这样在组件中就可以自己调用自己了。就像在函数中直接调用函数名来来递归。

2.组件的递归中一层又一层数据是如何获取到的?

答:将嵌套的数据重新赋值给prop设置的属性。

 <tree-menu v-for="(item,index) in model.children"  v-bind:model="item" v-bind:key="index"></tree-menu>

3.组件递归是怎么结束的?

判断数据中是否存在属性,以及该属性的值不为空。见下面代码中的haschild方法。

      hasChild(){
return this.model.children && this.model.children.length
}

下面的代码来自https://www.jianshu.com/p/84eb67487113

准备数据文件——testdata.js

var demoData = [
{
'id': '1',
'menuName': '基础管理',
'menuCode': '10',
'children': [
{
'menuName': '用户管理',
'menuCode': '11'
},
{
'menuName': '角色管理',
'menuCode': '12',
'children': [
{
'menuName': '管理员',
'menuCode': '121'
},
{
'menuName': 'CEO',
'menuCode': '122'
},
{
'menuName': 'CFO',
'menuCode': '123'
},
{
'menuName': 'COO',
'menuCode': '124'
},
{
'menuName': '普通人',
'menuCode': '124'
}
]
},
{
'menuName': '权限管理',
'menuCode': '13'
}
]
},
{
'id': '2',
'menuName': '商品管理',
'menuCode': ''
},
{
'id': '3',
'menuName': '订单管理',
'menuCode': '30',
'children': [
{
'menuName': '订单列表',
'menuCode': '31'
},
{
'menuName': '退货列表',
'menuCode': '32',
'children': []
}
]
},
{
'id': '4',
'menuName': '商家管理',
'menuCode': '',
'children': []
}
]; export default demoData;

父组件

<template>
<div class="tree-menu">
<ul v-for="menuItem in theModel">
//使用子组件,并将数据传给子组件的model属性上,供子组件使用。
<my-tree :model="menuItem"></my-tree>
</ul>
</div>
</template> <script>
import testData from './testdata';
import myTree from './treeMenu'; export default {
//name属性是组件的名字,这样组件才能调用组件自己。
name: "side-bar",
components: {
//即treeMenu文件,它在side-bar组件中的名字设置为了myTree。
myTree
},
data() {
return {
//绑定数据供v-for循环使用。
theModel: testData
}
}
}
</script>

子组件treeMenu(树形组件,递归)

<template>
<li>
//控制图标的显示
<span @click="toggle">
<i v-if="hasChild" class="icon" v-bind:class="[open ? 'folder-open': 'folder' ]"></i>
<i v-if="!hasChild" class="icon file-text"></i>
{{model.menuName}}
</span>
//判断数据中是否有可遍历的属性。
<ul v-show="open" v-if="hasChild">
//如果有可遍历的属性,调用组件自己(tree-menu),获取下一层可以遍历的数据,将下一层可遍历属性绑定到model作为model新的数据。
//key用来标识组件的唯一性,避免重复渲染。
<tree-menu v-for="(item,index) in model.children" v-bind:model="item" v-bind:key="index"></tree-menu>
</ul>
</li>
</template> <script>
export default {
//name属性定义组件名,有了名字组件才可以调用自己。
name: "treeMenu",
props: ['model'],
data(){
return {
open:false
}
},
computed:{
hasChild(){
//有children属性且属性值的长度不为零,那么就递归。
return this.model.children && this.model.children.length
}
},
methods:{
toggle(){
if(this.hasChild){
this.open = !this.open
}
}
}
}
</script>
 

vue组件递归的一些理解的更多相关文章

  1. vue组件的一些知识理解

    组件我们在项目中会很常用到,说下自己在学习过程中的理解,有关 组件初始化顺序,组件为什么data是function,组件的生命周期 1. Vue.component('', {})  注册全局组件,组 ...

  2. vue组件递归

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. vue - Vue组件化编程

    今天是对vue组件化的一个理解,最主要的单文件组件,然后就可以脚手架的学习了,本来昨晚就该上传的,但是用的那个上传博客园的Python脚本不行了,换了一个新的. 组件化让我越来越感觉到框架的力量了 一 ...

  4. vue笔记 递归组件的使用

    递归组件 什么是递归组件? 组件自身去调用组件自身. 代码示例 DetailList.vue(子组件-递归组件) <template> <div> <div class= ...

  5. vue 之组件递归;

    在开发一个 PC 端的项目时,需要开发一个树状结构,直接上效果图如下:点击 "+" 号的时候则展开下一级,点击 "-" 号的时候则收起: 之所以写这篇博客,因为 ...

  6. 深入理解 Vue 组件

    深入理解 Vue 组件 组件使用中的细节点 使用 is 属性,解决组件使用中的bug问题 <!DOCTYPE html> <html lang="en"> ...

  7. 【Vue.js实战案例】- Vue.js递归组件实现组织架构树和选人功能

    大家好!先上图看看本次案例的整体效果. 浪奔,浪流,万里涛涛江水永不休.如果在jq时代来实这个功能简直有些噩梦了,但是自从前端思想发展到现在的以MVVM为主流的大背景下,来实现一个这样繁杂的功能简直不 ...

  8. 用Vue.js递归组件构建一个可折叠的树形菜单

    在Vue.js中一个递归组件调用的是其本身,如: Vue.component('recursive-component', {   template: `<!--Invoking myself! ...

  9. vue+element UI以组件递归方式实现多级导航菜单

    介绍 这是一个是基于element-UI的导航菜单组件基础上,进行了二次封装的菜单组件,该组件以组件递归的方式,实现了可根据从后端接收到的json菜单数据,动态渲染多级菜单的功能. 使用方法 由于该组 ...

随机推荐

  1. mybatis与spring整合配置

    mybatis与spring整合配置: 第一种方式:(此处配置扫描的包路径.注解.每个mapper类上面需要加@Repository才能纳入spring的bean管理器中) <!-- 自动扫描m ...

  2. SpringBoot(一) 基础入门

    SpringBoot简要 简化Spring应用开发的一个框架: 整个Spring技术栈的一个大整合: J2EE开发的一站式解决方案: 自动配置:针对很多Spring应用程序常见的应用功能,Spring ...

  3. latex简历遇到的问题

    博一时候简历就没弄出来,现在又要用了,于是找出当初的模板.发现问题在于编码. \XeTeXinputencoding "GBK" \XeTeXdefaultencoding &qu ...

  4. 【Java】新建的web项目的jsp页面报错的解决方法

    一.错误信息 当用Eclipse新建web项目后,在里面建个jsp页面可能出现如下图的错误,jsp文件有一个红叉: 主要原因是:依赖tomcat类库 解决方案:项目右击—>build path ...

  5. rman备份简介

    登陆rman: [oracle@oracle ~]$ rman target / connected to target database: FSDB (DBID=1179347208) 执行全备: ...

  6. 安卓怎么不如ios运行流畅

    一.优先级别不同:iOS最先响应屏幕当我们使用iOS或者是Android手机时,第一步就是滑屏解锁找到相应程序点击进入.而这个时候往往是所有操控开始的第一步骤,iOS系统产品就表现出来了流畅的一面,但 ...

  7. 关于Scrapy爬虫项目运行和调试的小技巧(上篇)

    扫除运行Scrapy爬虫程序的bug之后,现在便可以开始进行编写爬虫逻辑了.在正式开始爬虫编写之前,在这里介绍四种小技巧,可以方便我们操纵和调试爬虫. 一.建立main.py文件,直接在Pycharm ...

  8. django框架-Admin管理站点搭建

    在django框架中,admin基本上算是已经写好了的,拿过来进行简单的处理即可以使用的,相对于flask来说已经是相当的便捷了. 在使用中,步骤如下: 1.管理界面本地化:即将英文标题等的变成中文, ...

  9. NOIp2018模拟赛四十四

    加量不加价?! 昨晚看时间变成了3.5h以为终于变成了正常难度,结果还是国家集训队作业... A题看起来很神仙,B题看上去很神仙,C题一看就知道很神仙: 结果发现B是假题,放榜后发现A也是假题,C是Y ...

  10. json对象与其字符串之间的转换

    在数据传输过程中,json是以文本,即字符串的形式传递的,而JS操作的是JSON对象,所以,JSON对象和JSON字符串之间的相互转换是关键.例如: JSON字符串:var str1 = '{ &qu ...