详细介绍vue的递归组件(重要)
递归组件在 Vue 中是一个非常强大的概念,尤其在渲染层级结构(如树形结构、嵌套列表、评论系统等)时,能够极大地简化代码。
什么是递归组件?
递归组件就是一个组件在其模板中引用自身。这种做法通常用于渲染树形结构或者嵌套的层级结构。比如你可能会遇到这样一个需求:你有一个数据结构,它包含父节点和子节点,每个节点可能又有自己的子节点,依此类推。使用递归组件,可以很方便地渲染这种嵌套的结构。
为什么使用递归组件?
当你需要渲染复杂的嵌套数据时,比如树形目录、评论回复、组织结构图等,递归组件能够帮助你将渲染逻辑封装在一个组件中,使代码更加简洁易维护。
递归组件的工作原理
递归组件的核心思想就是:组件通过自己来渲染自己。每次组件被渲染时,它会将当前的子项作为新组件的 prop 传递给自己,直到所有子项都被渲染完。
递归组件的基本结构
一个简单的递归组件通常由以下几部分构成:
父组件:传递数据和子组件的结构。
子组件:在其模板中通过 v-for 遍历并渲染自己。
递归组件示例:树形结构
让我们通过一个实际的例子来理解递归组件。在这个例子中,我们将创建一个树形结构的目录(如文件夹)展示:
数据结构
假设我们有以下这样的数据结构,它表示一个文件夹树:
const folders = [{id: 1,name: 'Folder 1',children: [{ id: 2, name: 'File 1.1', children: [] },{ id: 3, name: 'File 1.2', children: [] }]},{id: 4,name: 'Folder 2',children: [{id: 5,name: 'Folder 2.1',children: [{ id: 6, name: 'File 2.1.1', children: [] }]}]}
];
递归组件代码:
我们会创建一个递归组件 Folder,用来显示每个文件夹及其子文件夹。
Folder.vue(递归组件)
<template><div><!-- 显示当前文件夹的名称 --><div>{{ folder.name }}</div><!-- 如果该文件夹有子文件夹或文件,递归渲染子文件夹 --><div v-if="folder.children && folder.children.length"><folder v-for="child in folder.children" :key="child.id" :folder="child" /></div></div>
</template><script>
export default {name: 'Folder', // 递归组件的名称props: {folder: Object // 接收一个 folder 对象作为 prop}
};
</script><style scoped>
div {padding-left: 20px; /* 嵌套时,子文件夹有缩进 */border-left: 1px solid #ccc;margin: 5px 0;
}
</style>
App.vue(父组件)
在父组件中,我们将传递 folders 数据并展示递归组件。
<template><div><h1>文件夹树</h1><folder v-for="folder in folders" :key="folder.id" :folder="folder" /></div>
</template><script>
import Folder from './Folder.vue'; // 引入递归组件export default {name: 'App',components: {Folder},data() {return {// 树形结构的数据folders: [{id: 1,name: 'Folder 1',children: [{ id: 2, name: 'File 1.1', children: [] },{ id: 3, name: 'File 1.2', children: [] }]},{id: 4,name: 'Folder 2',children: [{id: 5,name: 'Folder 2.1',children: [{ id: 6, name: 'File 2.1.1', children: [] }]}]}]};}
};
</script>
Folder 组件:
folder 是一个 prop,表示当前文件夹的信息。它包含一个 name(文件夹的名字)和 children(子文件夹或文件)属性。
在模板中,我们首先显示文件夹的名字 ({{ folder.name }})。
然后,使用 v-for 遍历 folder.children,如果存在子文件夹或文件,就递归地渲染一个新的 folder 组件。这就是递归的关键。
App 组件:
folders 数据包含多个文件夹,每个文件夹可能有子文件夹或文件。通过将这个数据传递给 Folder 组件,我们最终渲染出嵌套的文件夹结构。
渲染出来的 HTML 结构类似于:
文件夹树
- Folder 1- File 1.1- File 1.2
- Folder 2- Folder 2.1- File 2.1.1
//每个文件夹会递归地渲染自己,直到没有更多的子文件夹为止。
递归组件的优点
简洁:递归组件能够将复杂的嵌套结构提取成简单的代码,使得渲染逻辑更加清晰。
灵活:对于动态数据结构(如评论、文件夹树、分类等),递归组件能够非常方便地处理不同层级的数据。
易于维护:递归组件使得层级渲染的逻辑集中在一个地方,代码更易于修改和维护。
注意事项
性能问题:虽然递归组件非常方便,但如果数据结构非常深,递归调用可能会带来性能上的问题。此时需要考虑优化,比如限制递归层级或懒加载。
终止条件:递归组件需要确保存在终止条件(例如,没有更多子节点时停止递归)。
相关文章:
详细介绍vue的递归组件(重要)
递归组件在 Vue 中是一个非常强大的概念,尤其在渲染层级结构(如树形结构、嵌套列表、评论系统等)时,能够极大地简化代码。 什么是递归组件? 递归组件就是一个组件在其模板中引用自身。这种做法通常用于渲染树形结构或…...
【单片机基础知识】基础知识(CortexM系列、STM32系统框架、存储器映射、寄存器映射)
1. CortexM系列介绍 ARM官方资料: 📎Arm Cortex-M4 Processor Datasheet.pdf📎Arm-Cortex-M7-Processor-Datasheet.pdf📎Arm Cortex-M Comparison Table_v3.pdf📎Arm Cortex-M3 Processor Datasheet.pdf 课程资料&a…...
yolov5导出命令
python export.py --weights yolov5s.pt --img-size 640 --batch-size 1 --device cpu --include onnx 关闭动态输入,cpu导出 检测onnx模型能否加载成功指令: python detect.py --weights yolov5s.onnx --dnn 终端调用detect.py检测图片命令&…...
RabbitMQ的常用术语介绍
出版商 “出版商”一词在不同的上下文中有不同的含义。一般来说,在消息传递中 发布者(也称为“生成者”)是应用程序(或应用程序实例) 发布 (生成) 消息。同一应用程序也可以使用消息 因此同时也…...
Docker魔法:用docker run -p轻松开通容器服务大门
前言 “容器”与“虚拟化”作为现代软件开发和运维中的关键概念,已经广泛应用于各个技术领域。然而,在使用 Docker 部署应用时,常常会遇到这样的问题:容器正常运行,却无法让外界访问其内部服务?即使容器内的应用顺利启动,外部无法通过浏览器或 API 进行连接。此时,doc…...
【后端面试总结】Redis过期删除策略
Redis会将每个设置了过期时间的key放入一个独立的字典中,以后会定时遍历这个字典来删除到期的key。除了定时遍历之外,它还会使用惰性策略来删除过期的key。所谓惰性策略就是在客户端访问这个key的时候,Redis对key的过期时间进行检查ÿ…...
数字图像处理(15):图像平移
(1)图像平移的基本原理:计算每个像素点的移动向量,并将这些像素按照指定的方向和距离进行移动。 (2)平移向量包括水平和垂直分量,可以表示为(dx,dy)ÿ…...
高级java每日一道面试题-2024年12月08日-JVM篇-什么是类加载器?
如果有遗漏,评论区告诉我进行补充 面试官: 什么是类加载器? 我回答: 在Java高级面试中,类加载器(ClassLoader)是一个重要的概念,它涉及到Java类的加载和初始化机制。以下是对类加载器的详细解释: 定义与作用 类加…...
JAVA子类的无参构造器中第一行的super
在 Java 中,子类的构造器是否需要显式调用 super 取决于父类(超类)的构造器。 如果父类有一个无参构造器: 如果父类有一个无参构造器,那么子类的构造器可以不显式调用 super。在这种情况下,如果子类构造器的…...
mysql程序介绍,选项介绍(常用选项,指定选项的方式,特性),命令介绍(查看,部分命令),从sql文件执行sql语句的两种方法
目录 mysql程序 介绍 选项 介绍 常用选项 指定选项的方式 编辑配置文件 环境变量 选项特性 指定选项 选项名 选项值 命令 介绍 查看客户端命令 tee/notee prompt source system help contents 从.sql文件执行sql语句 介绍 方式 source 从外部直接导入…...
Unity教程(十九)战斗系统 受击反馈
Unity开发2D类银河恶魔城游戏学习笔记 Unity教程(零)Unity和VS的使用相关内容 Unity教程(一)开始学习状态机 Unity教程(二)角色移动的实现 Unity教程(三)角色跳跃的实现 Unity教程&…...
lanqiaoOJ 3744:小蓝的智慧拼图购物 ← pair+优先队列
【题目来源】https://www.lanqiao.cn/problems/3744/learning/【题目描述】 在小蓝的生日那天,他得到了一个由神秘人赠送的拼图游戏,每个拼图都有其特定的价值和相应的优惠券。小蓝决定要买下所有的拼图,但他希望能尽可能地节省花费。小蓝手中…...
Spring Boot教程之二十一:文件处理
Spring Boot – 文件处理 Spring Boot 是一种流行的、基于 Spring 的开源框架,用于开发强大的 Web 应用程序和微服务。由于它建立在 Spring 框架之上,因此它不仅具有 Spring 的所有功能,而且还包括某些特殊功能,例如自动配置、健康…...
【Linux】Linux的基本常识+指令
目录 1. 整体学习思维导图 2. 常见快捷键操作 3. 基本指令 pwd指令 whoami指令 ls 指令 touch指令 cd 指令 Stat 指令 mkdir 指令 alias指令 nano 指令 rmdir 和 rm 指令 man 指令手册 cp 命令 cat/echo/tac 指令 mv 指令 less 指令 head/tail 指令 date…...
Rocky Linux 9.3系统搭建Slurm环境【笔记】
实践环境:Rocky Linux 9.3 [root@m1 ~]# cat /etc/redhat-release Rocky Linux release 9.3 (Blue Onyx) [root@m1 ~]# uname -r 5.14.0-362.8.1.el9_3.x86_64 [root@m1 ~]#主机名和IP ● 控制节点m1:10.1.1.10 ● 计算节点c1:10.1.1.11 ● 计算节点c2:10.1.1.12 一、…...
原生微信小程序使用原子化tailwindcss
这里使用了第三方库来实现:https://weapp-tw.icebreaker.top/ 官方配置步骤一: https://weapp-tw.icebreaker.top/docs/quick-start/native/install 官方配置步骤二:https://weapp-tw.icebreaker.top/docs/quick-start/native/install-plugin 我下面的操作步骤跟官方步骤…...
《掌握Nmap:全面解析网络扫描与安全检测的终极指南》
nmap # 简介(帮助) 用法:nmap [扫描类型] [选项] {目标指定内容} 简介(帮助) 用法:nmap [扫描类型] [选项] {目标指定内容} 一、目标指定: 可以传入主机名、IP 地址、网络等。 例如&a…...
k8s-Informer概要解析(2)
Client-go 主要用在 k8s 控制器中 什么是 k8s Informer Informer 负责与 kubernetes APIServer 进行 Watch 操作,Watch 的资源,可以是 kubernetes 内置资源对象,也可以 CRD。 Informer 是一个带有本地缓存以及索引机制的核心工具包&#x…...
UE5基本数据类型
bool: 表示布尔值,只有两个取值:true 或 false,用于表示逻辑条件。int8: 表示 8 位的有符号整数,范围是 −128−128 到 127127。uint8: 表示 8 位的无符号整数,范围是 00 到 255255。int16: 表示 16 位的有符号整数&am…...
Next.js 系统性教学:中间件与国际化功能深入剖析
更多有关Next.js教程,请查阅: 【目录】Next.js 独立开发系列教程-CSDN博客 目录 一、Next.js 中间件 (Middleware) 功能解析 1.1 什么是中间件? 1.2 Next.js 中间件的工作机制 1.3 中间件的功能应用 身份验证与授权 请求重定向 修改请…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...
Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换
目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...
FFmpeg:Windows系统小白安装及其使用
一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...
