微信搜索 【大迁世界】, 我会第一时间和你分享前端行业趋势,学习途径等等。 本文 GitHub https://github.com/qq449245884/xiaozhi 已收录,有一线大厂面试完整考点、资料以及我的系列文章。
大多数现代社交网络都包括一个功能,用户可以通过对该特定评论的评论来回复评论。如果我们将其可视化,我们的评论的数据会像下面的结构:
- Comment A
- comment a1
- comment a12
- comment a2
- Comment B
- Comment C
Comment A
有子评论 comment a1
和 comment a2
。反过来,comment a1
有子评论comment a12
,它也可以有自己的子评论。
有了这种结构,我们可以让一个注释有无数层的子注释。你可能已经熟悉了这种结构化数据的方法,也就是所谓的树状结构。不理解的可以想想电脑上的目录,一个文件夹可以有子文件夹等等。
这节课,我们来看看在Vue中如何使用递归组件来管理树状结构的数据。在介绍 Vue 中递归组件之前,我们先回顾一下什么是递归。
什么是递归递归简单的说就是自己调用自己,考虑下面这个函数:
function sum_numbers(arr, n) {
return sum_numbers(arr, n - 1) + arr[n - 1];
}
虽然有些缺陷的,但上面的函数可以被认为是递归函数,因为它在函数中调用了自己。然而,这个定义并不包括所有的内容。递归是一种解决问题的方法。它基于这样一个前提:给定一个问题,如果我们知道其子问题的解决方案,我们就可以找到其解决方案。
例如,上面的 sum_numbers
函数可以找到一个给定数组 arr = [1, 2, 3, 4, 5]
中所有数字的总和。在求和问题中,如果我们知道5
之前的所有数字之和,那么我们可以将问题简化为arr
中的数字之和等于最后一个元素和最后一个元素之前所有数字之和。
在上面定义的sum_numbers
函数中,表达式 return sum_numbers(arr, n - 1) + arr[n - 1];
所做的正是我们刚才描述的。
为了 描绘 sum_numbers 函数在输入 [1, 2, 3, 4]
的情况下如何从头到尾执行,请看下面的代码:
**sum_numbers([1, 2, 3, 4], 4)
|
calls
|**
**sum_numbers([1, 2, 3], 3) + 4
|
calls
|
sum_numbers([1, 2], 2) + 3
|
calls
|
sum_numbers([1], 1) + 2
|
calls
|
sum_numbers([], 0) + 1 --** 这里有一个问题
这里有一个问:;我们的递归函数试图将一个空列表添加到一个数字中。事实上,更大的问题是,我们的递归函数会一直无限地调用自己。
为了确保我们的递归函数不会无限地调用自己,我们需要一个基本情况。你可以把基数看作是我们希望我们的函数停止自我调用的点。
在上面例子中,如果sum_numbers
函数中只有一个数字,它就应该停止调用自己。如果数组中只剩下一个数字,那么就没有什么可以与之相加的了,在这种情况下,我们只需返回这个数字。
function sum_numbers(arr, n) {
if(n { comment.comment }}{ comment }} ({
comments: [
{
comment: "First comment",
replies: [
{
comment: "sub-comment 1 for comment 1",
replies: [
{
comment: "sub-sub-comment 1",
replies: [
{
comment: "sub-sub-sub-comment 1",
},
{ comment: "sub-sub-sub-comment 2" },
],
},
{ comment: "sub-sub-comment 2" },
],
},
{ comment: "sub-comment 2 for comment 1" },
],
},
{
comment: "Second comment",
replies: [
{
comment: "sub-comment 1 for comment 2",
replies: [
{ comment: "sub-sub-comment 1" },
{ comment: "sub-sub-comment 2" },
],
},
{ comment: "sub-comment 2 for comment 2" },
],
},
],
}),
components: {
Comment,
},
};
.comments ul {
padding-left: 16px;
margin: 6px 0;
}
运行,效果如下所示:
虽然我们举的例子不是一个典型的评论组件,但我们的目标是探索如何利用Vue中递归组件的力量来渲染嵌套数据。
我们看到,我们可以通过创建一个在自己的模板中引用自己的组件来做到这一点。这种递归方法在渲染那些看似不同但结构相同的数据实体时特别有用。例如,以我们的 comments
和 replies
为例。
乍一看,我们好像需要两个组件,一个用于comments
,另一个用于 replies
。但是,用递归的方法,我们能够用一个组件来渲染这两种内容。最重要的是,我们的组件会渲染所有的评论和回复,直到它达到终止条件。
编辑中可能存在的bug没法实时知道,事后为了解决这些bug,花了大量的时间进行log 调试,这边顺便给大家推荐一个好用的BUG监控工具 Fundebug。
作者:Nyior Clement 译者:前端小智 来源:logrocket
原文:https://blog.logrocket.com/author/nyiorclement/
交流有梦想,有干货,微信搜索 【大迁世界】 关注这个在凌晨还在刷碗的刷碗智。
本文 GitHub https://github.com/qq449245884/xiaozhi 已收录,有一线大厂面试完整考点、资料以及我的系列文章。