1. 首页

Vue中递归组件很难理解?

简介

有人说递归很难理解,也有人不这么认为。递归函数简单的定义是:一个自调用函数,这意味着它将在执行的某个时刻调用自己。

从理论上讲,递归是一种需要两个属性的行为:

  • 结束点:停止递归的情况
  • 一组规则:负责将所有的操作减少到结束点

咱们无法决定哪一个更重要。如果没有结束点,递归将成为一个无限循环,但是如果一组规则就不能实现期望的行为,所以两者都存在才能使它正常工作。

递归和 Vue 组件

在 Vue 中,递归非常有用。当然,不仅仅在 Vue 中,咱们可以遵循上面的规则在任何框架中实现递归行为。因此,根据给定的定义,咱们可以说递归组件是调用自身的组件。

递归组件什么时候有用? 只要咱们需要使用相同的模板结构,但需要使用分层输入数据,就可以使用递归。 如果树状视图(用于显示文件夹结构),网站上的注释,嵌套菜单等组件等等。

接着,咱们建立一个场景来演示递归组件的用途。

场景

想象一下,咱像往常一样来上班,给自己冲杯咖啡,开始阅读咱最喜欢的博客。突然,咱们的老板来了,说需要实现一个新的页面,在这个页面上,显示所有的文件夹、子文件夹和文件,且文件结构数量不确定。可以显示10个、5个或100个文件夹。接着,咱们喝着咖啡,开始挠头思考如何解决这个问题。最终,咱们会想到使用递归遍历来实现。

解决这个问题的组件的最少数量是1,但在咱们的示例中,咱们会创建两个组件:

  • root 组件
  • folder 组件

当然,咱们首先搞点数据来用:

数据

如前所述,当咱们有分层组织的数据,其中子数据具有与其父数据相同的结构时,递归就派上用场了。


const root = { text: 'Root Folder', leaf: false, expanded: true, children: [{ text: 'Sub Folder 1', leaf: false, expanded: false, children: [{ text: 'Sub Sub Folder 1', leaf: false, expanded: false, children: [{ text: 'SomeFile1.js', leaf: true }] }, { text: 'Sub Sub Folder 2', leaf: false, expanded: false, children: [] }, { text: 'SomeFile.txt', leaf: true }] }] }

有了上面的数据,咱们开始创建组件。

root 组件

这个组件是咱们文件夹树的起点。它会开始所有子元素的沉浸,但是如果需要,它也可以显示一些独立的信息,因为它不是递归本身的一部分。

root 组件将包含一个folder属性,咱们会把root数据对象绑定到该属性上。此属性将传递给子组件,子组件将递归地创建基于它的文件夹树结构。

Template


<template> <ul class="folders"> <li>Folders</li> <folder v-bind:folder="folder"></folder> </ul> </template>

代码

JS中文网 – 前端进阶资源分享 www.javascriptC.com
一个致力于帮助开发者用代码改变世界为使命的平台,每天都可以在这里找到技术世界的头条内容


import Folder from './Folder.vue'; export default { name: 'root', props: { folder: Object }, components: { Folder } };

样式


ul.folders { padding: 1rem; margin: 0; box-sizing: border-box; width: 100%; list-style: none } ul.folders > li:first-child { padding: 1rem 1rem 1rem 0 }

就是这么简单。

folder 组件

此组件负责渲染树中的每个文件夹。它负责显示关于当前文件夹的信息,并渲染其子文件夹(如果有的话)。此外,这些文件夹是可单击的,通过单击其中一个,组件将显示其子文件夹和文件。

Template


<template> <li class="folder" v-bind:class="[folder.leaf ? 'is-leaf' : 'is-folder']"> <span v-on:click="expand()">{{ folder.text }}</span> <ul class="sub-folders" v-if="folder.children && folder.children.length > 0" v-show="folder.expanded"> <folder v-for="child in folder.children" v-bind:folder="child"></folder> </ul> <div class="folder-empty" v-else v-show="!folder.leaf && folder.expanded">No Data</div> </li> </template>

Code


export default { name: "folder", props: { folder: Object }, methods: { expand() { if (this.folder.leaf) { return; } this.folder.expanded = !this.folder.expanded; } } };

样式:


li.is-folder { padding: 1rem; border-left: 1px solid #d3d3d3; margin-bottom: 0.5rem } li.is-folder > span { padding: 0.5rem; border: 1px solid #d3d3d3; cursor: pointer; display:inline-block } li.is-leaf { padding: 0 0 0 1rem; color: #000; } ul.sub-folders { padding: 1rem 1rem 0 0; margin: 0; box-sizing: border-box; width: 100%; list-style: none } div.folder-empty { padding: 1rem 1rem 0 1rem; color: #000; opacity: 0.5 }

使用示例

为了使用咱们刚刚创建的组件,所需要做的就是将root组件导入到需要此功能的地方,并传递数据结构。例如,在 App.vue 中使用:

Template


<template> <div class="vue-app"> <root v-bind:folder="root"></root> </div> </template>

Code


import Root from './Root.vue'; export default { name: 'app', data: function () { return { root: { text: 'Root Folder', leaf: false, expanded: true, children: [{ text: 'Sub Folder 1', leaf: false, expanded: false, children: [{ text: 'Sub Sub Folder 1', leaf: false, expanded: false, children: [{ text: 'SomeFile1.js', leaf: true }] }, { text: 'Sub Sub Folder 2', leaf: false, expanded: false, children: [] }, { text: 'SomeFile.txt', leaf: true }] }] } } }, components: { Root } };

运行效果:

Js中文网 · 前端进阶资源教程 www.javascriptc.com

总结

递归并不像看起来那么难,它只是用不同的输入参数一次又一次地执行相同的代码块,直到达到结束点。希望本文能够更好帮大家理解递归以及如何使用Vue创建递归组件。

交流

干货系列文章汇总如下,觉得不错点个Star,欢迎 加群 互相学习。

作者:Milos Protic
译者:前端小智
链接:https://segmentfault.com/a/1190000021079323

看完两件小事

如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:

  1. 关注我们的 GitHub 博客,让我们成为长期关系
  2. 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
  3. 关注公众号 「画漫画的程序员」,公众号后台回复「资源」 免费领取我精心整理的前端进阶资源教程

JS中文网是中国领先的新一代开发者社区和专业的技术媒体,一个帮助开发者成长的社区,目前已经覆盖和服务了超过 300 万开发者,你每天都可以在这里找到技术世界的头条内容。欢迎热爱技术的你一起加入交流与学习,JS中文网的使命是帮助开发者用代码改变世界

本文著作权归作者所有,如若转载,请注明出处

转载请注明:文章转载自「 Js中文网 · 前端进阶资源教程 」https://www.javascriptc.com

标题:Vue中递归组件很难理解?

链接:https://www.javascriptc.com/3510.html

« 前端性能优化:缓存 React 事件来提高性能
通过 20 个棘手的ES6面试问题来提高咱们的 JS 技能»
Flutter 中文教程资源

相关推荐

QR code