递归组件的使用

1. 封装简单的Menu组件

一个子组件就相当于一个父组件的html标签
父组件: menu-page.vue
子组件: a-menu.vue、a-menu-item.vue、a-submenu.vue
还有个暴露子组件的index.js

先上一张最后渲染的结果:

menu-page.vue

<template><div class="menu-box"><a-menu><a-menu-item>111</a-menu-item><a-menu-item>222</a-menu-item><a-submenu><div slot="title">333</div><a-menu-item>333-11</a-menu-item><a-submenu><div slot="title">333-22</div><a-menu-item>333-22-1</a-menu-item><a-menu-item>333-22-2</a-menu-item></a-submenu></a-submenu></a-menu></div>
</template>
<script>
import menuComponents from '_c/menu'
const { AMenu, AMenuItem, ASubmenu } = menuComponentsexport default {name: 'menu_page',components: {AMenu,AMenuItem,ASubmenu}
}
</script><style lang="less">
.menu-box{width: 300px;height: 400px;
}
</style>

a-menu.vue

<template><div class="a-menu"><slot></slot></div>
</template><script>
export default {name: 'AMenu'
}
</script><style lang="less">
.a-menu{& *{list-style: none;}ul{padding: 0;margin: 0;}
}
</style>

a-menu-item.vue

<template><div><li class="a-menu-item"><slot></slot></li></div>
</template><script>
export default {name: 'AMenuItem'
}
</script><style lang="less">
.a-menu-item{background: red;
}
</style>

a-submenu.vue

<template><ul class="a-submenu"><div class="a-submenu-title" @click="handClick"><slot name="title"></slot><span class="shrink-icon" :style="{ transform: `rotateZ(${showChild ? 0 : 180}deg)`}">^</span></div><div v-show="showChild" class="a-submenu-child-box"><slot></slot></div></ul>
</template><script>
export default {name: 'ASubmenu',data () {return {showChild: false}},methods: {handClick () {this.showChild = !this.showChild}}
}
</script><style lang="less">
.a-submenu{background: gray;color: #fff;&-title{position: relative;.shrink-icon{position: absolute;top: 2px;right: 10px;}}&-child-box{overflow: hidden;padding-left: 20px;}li{background: gray;}
}
</style>

index.js

import AMenu from './a-menu.vue'
import AMenuItem from './a-menu-item.vue'
import ASubmenu from './a-submenu.vue'export default{AMenu,AMenuItem,ASubmenu
}

2.递归组件

子组件不断调用自身(需要组件有name属性),接上面组件的例子,修改menu-page.vue,新增re-subname.vue

最后渲染的效果图

menu-page.vue

<template><div class="menu-box"><a-menu><template v-for="(amenu, index) in list"><a-menu-item :key="index" v-if="!amenu.children">{{amenu.title}}</a-menu-item><re-submenu v-else :menu="amenu" :index="index" :key="index"></re-submenu></template></a-menu></div>
</template>
<script>
import menuComponents from '_c/menu'
import reSubmenu from './re-submenu.vue'
const { AMenu, AMenuItem, ASubmenu } = menuComponentsexport default {name: 'menu_page',data () {return {list: [{title: '1111'},{title: '2222'},{title: '3333',children: [{title: '3333-1'},{title: '3333-2',children: [{title: '3333-2-1'},{title: '3333-2-2'},{title: '3333-2-3',children: [{title: '3333-2-3-1'},{title: '3333-2-3-2'}]}]}]}]}},components: {AMenu,AMenuItem,ASubmenu,reSubmenu}
}
</script><style lang="less">
.menu-box{width: 300px;height: 400px;
}
</style>

re-subname.vue

<template><a-submenu><div slot="title">{{ menu.title }}</div><template v-for="(amenu, jndex) in menu.children"><a-menu-item :key="jndex" v-if="!amenu.children">{{amenu.title}}</a-menu-item><re-submenu v-else :menu="amenu" :index="`${index}_${jndex}`" :key="`${index}_${jndex}`"></re-submenu></template></a-submenu>
</template><script>
import menuComponents from '_c/menu'
const { AMenuItem, ASubmenu } = menuComponentsexport default {name: 'reSubmenu',components: {AMenuItem,ASubmenu},props: {menu: {type: Object,default: function () {return {}}},index: {type: Number}}
}
</script>

第十三课时:递归组件的使用相关推荐

  1. vue树形结构html,怎么在vue中利用递归组件实现一个树形控件

    怎么在vue中利用递归组件实现一个树形控件 发布时间:2021-06-11 17:26:48 来源:亿速云 阅读:81 作者:Leah 本篇文章为大家展示了怎么在vue中利用递归组件实现一个树形控件, ...

  2. vue 循环 递归组件_Vue一个案例引发的递归组件的使用

    今天我们继续使用 Vue 的撸我们的实战项目,只有在实战中我们才会领悟更多,光纸上谈兵然并卵,继上篇我们的<Vue一个案例引发的动态组件与全局事件绑定总结> 之后,今天来聊一聊我们如何在项 ...

  3. vue 递归组件多级_Vue递归组件实现树形结构菜单

    Tree 组件是递归类组件的典型代表,它常用于文件夹.组织架构.生物分类.国家地区等等,世间万物的大多数结构都是树形结构.使用树控件可以完整展现其中的层级关系,并具有展开收起选择等交互功能. 如图所示 ...

  4. vue的递归组件以及三级菜单的制作

    js里面有递归算法,同时,我们也可以利用props来实现vue模板的递归调用,但是前提是组件拥有 name 属性 父组件:slotDemo.vue: <template><div&g ...

  5. react重新渲染菜单_React实现递归组件

    前言 今天来实现一个 React 的递归组件.具体的效果图如下: 图片说明 假设后端返回的数据如下: [{ id: 1, parent_id: 0, name: '广东省', children: [{ ...

  6. [vue] vue中什么是递归组件?举个例子说明下?

    [vue] vue中什么是递归组件?举个例子说明下? 组件自己调用自己,场景有用于生成树形结构菜单 个人简介 我是歌谣,欢迎和大家一起交流前后端知识.放弃很容易, 但坚持一定很酷.欢迎大家一起讨论 主 ...

  7. 自定义ElementUI风格树形组件,详解递归组件的使用及事件数据传递,视图更新等问题

    组件视图样式 当我们做多级菜单或者权限列表管理的时候,大多会采用树形结构来实现,有的朋友为了省事,不想多费脑力,多费时间,直接几层for循环就做了个差不多的树形组件,更省事的朋友直接拿ElementU ...

  8. vue2 递归组件--树形

    递归组件,官方给的教程太简便了,根本看不出到底怎么用.于是自己查网摸索了一下,这儿只把核心思想写出来. 效果如下图,点击后打开二级菜单,再点击后打开三级. //js //引子//思想:当v-if='f ...

  9. vue树形权限菜单_Vue.js 递归组件实现树形菜单(实例分享)

    最近看了 Vue.js 的递归组件,实现了一个最基本的树形菜单. 项目结构: main.js 作为入口,很简单: import Vue from 'vue' Vue.config.debug = tr ...

最新文章

  1. node项目部署到服务器报错,记一次部署node项目到centos服务器经历
  2. python 更新pip 失败问题总结
  3. java 反转 控制 注入_控制反转和依赖注入
  4. 5G赋能中国智慧教育
  5. 苹果CMSv10自适应高权重模板源码
  6. 基于神经网络预测车道行驶的自动驾驶
  7. 什么是ie浏览器_关于几款电脑浏览器的使用感受,你用过吗?
  8. pytorch之expand和repeat
  9. Linux 内核协议栈 学习资料
  10. delphi调用https
  11. 矩孔菲涅尔衍射 matlab,圆孔矩孔的菲涅尔衍射模拟(matlab实现)-工程光学.docx
  12. 已知六条边的边长,求四面体体积
  13. DHTMLX Gantt 甘特图 使用
  14. 28款GitHub最流行的开源机器学习项目,推荐GitHub上10 个开源深度学习框架
  15. pytorch之深度神经网络概念全面整理
  16. 华为消费者业务公布2017上半年智能手机收入暴涨
  17. 用Java语言编写打印菱形
  18. 算法设计与分析——算法学基础(三):渐进记号
  19. cn.sample.mnn.detect A/libc: Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0 in tid
  20. 世界知名计算机科学家,世界顶尖计算机科学家排名出炉!两位郑州大学校友分列这两项之首...

热门文章

  1. 简单的socket通信实现
  2. 如何编写配置文件 JAVA_SpringBoot 如何编写配置文件
  3. php mdecrypt generic,mdecrypt_generic
  4. 数据仓库—数据仓库—Sybase IQ 介绍
  5. oracle Hint 使用
  6. 巨蟒python全栈开发-第11阶段 ansible_project2
  7. PE 学习之路 —— 区块表
  8. JSON.stringify时间的问题
  9. Vijos——T 1082 丛林探险
  10. Unity3d Fast Indirect illumination Using Two Virtual Spherical Gaussian Lights-Square Enix论文