大多数现代社交网络都包含一项功能,用户可以通过评论特定评论来回复评论。如果我们将其可视化,我们的评论数据将类似于以下结构:-评论A-评论a1-评论a12-评论a2-评论B-评论CCommentA有子评论commenta1和commenta2。反过来,评论a1有子评论a12,它也可以有自己的子评论。有了这个结构,我们可以让一个注解有无限层的子注解。您可能已经熟悉这种结构化数据的方法,称为树结构。不懂的可以想想电脑上的目录,一个文件夹可以有子文件夹等等。本节课,我们就来看看如何在Vue中使用递归组件来管理树状结构的数据。在介绍Vue中的递归组件之前,我们先来回顾一下什么是递归。什么是递归递归简单的调用自己,考虑下面的函数:functionsum_numbers(arr,n){returnsum_numbers(arr,n-1)+arr[n-1];}可以被认为是递归函数,因为它在函数内调用自身。然而,这个定义并不包括一切。递归是一种解决问题的方法。它基于这样一个前提,即给定一个问题,如果我们知道其子问题的解,就可以找到其子问题的解。例如,上面的sum_numbers函数求出给定数组arr=[1,2,3,4,5]中所有数字的总和。在求和问题中,如果我们知道5之前所有数字的和,那么我们就可以将问题简化为arr中等于最后一个元素的数字之和和最后一个元素之前所有数字的和。在上面定义的sum_numbers函数中,表达式returnsum_numbers(arr,n-1)+arr[n-1];做的正是我们刚才描述的。为了说明sum_numbers函数如何在给定输入[1,2,3,4]的情况下从头到尾执行,请看以下代码:**sum_numbers([1,2,3,4],4)|调用|****sum_numbers([1,2,3],3)+4|调用|sum_numbers([1,2],2)+3|调用|sum_numbers([1],1)+2|调用|sum_numbers([],0)+1--**这是一个问题这是一个问题:;我们的递归函数试图将一个空列表添加到一个数字中。事实上,更大的问题是我们的递归函数一直在无限地调用自己。为了确保我们的递归函数不会无限地调用自身,我们需要一个基本案例。您可以将基数视为我们希望函数停止调用自身的点。在上面的例子中,如果sum_numbers函数中只有一个数字,它应该停止调用自己。如果数组中只剩下一个数字,那么就没有什么可以添加的了,在这种情况下,我们只需返回该数字即可。functionsum_numbers(arr,n){if(n<=1){//BaseCasereturnarr[0];}else{returnsum_numbers(arr,n-1)+arr[n-1];}}基本上这就是递归的意思,但是它和Vue的递归组件有什么关系呢?Vue递归组件Vue中的组件是可重用的Vue实例。大多数时候,当我们在Vue中创建组件时,只是为了能够在其他地方重用它。比如一个电子商务网站,我们可以在多个页面展示产品。也可以有一个可以在不同页面上呈现的产品组件,而不是在每个需要的页面上重复产品组件代码。如果Vue组件在自己的模板中引用自己,则认为它是递归的。递归组件不同于普通组件。除了在别处重用之外,递归组件在它们的模板中引用自己。为什么组件会引用自身?当您在另一个组件内渲染一个组件时,对象组件是子组件,渲染它的组件是父组件。在产品组件的情况下,该组件可以将ProductReview作为其子组件。在这种情况下,对于这些组件所代表的实体,我们有两个不同的组件是有道理的,因为产品和评论在各个方面都是不同的。但是,如果我们以Comment和Sub-comment为例,那就不一样了。这两个组件代表同一件事。子评论也是评论。因此,对于我们来说,评论和子评论有两个不同的组件是没有意义的,因为它们在结构上是相同的。我们只能有一个引用自身的Comment组件。还是太抽象了?请参阅下面的代码段:
