”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > React 中 props.children 的完整指南

React 中 props.children 的完整指南

发布于2024-07-31
浏览:864

A Complete Guide To props.children In React

我使用 React 开发了几个月,但没有完全理解 React 组件模型的真正威力。有一天,我决定深入研究作曲,这就是我学到的。

React 组件和子组件

在 React 中,一个组件可以有一个、多个子组件,也可以没有子组件。很好,但是等等 —— 什么是“孩子”?我们用一个例子来解释一下:


  
  

配置文件组件有两个子组件:ProfileImage 和 ProfileDetails,而这两个没有子组件

“在同时包含开始标签和结束标签的 JSX 表达式中,这些标签之间的内容作为特殊 props 传递:props.children” — React 文档

本质上,props.children是一个特殊的prop,自动传递给每个组件,可用于在调用组件时渲染开始和结束标记之间包含的内容。这些类型的组件被官方文档标识为“boxes”。

通过 JSX 语法识别组件

在 React 的 JSX 中,具有子组件的组件始终由开始标签和结束标签来标识。每个子项都必须放置在这两个标签之间,就像我们在上面看到的那样。当组件没有子组件时,您可以使用 调用它,但通常首选后一种语法。自闭合标签的目的是使代码更短且更易于阅读。

操作中的 props.children

假设我们要创建一个 ImageSlider 组件。我们的目标是像这样调用组件:


  React 中 props.children 的完整指南
  React 中 props.children 的完整指南
  React 中 props.children 的完整指南

可以看到,ImageSlider是由多个React 中 props.children 的完整指南组成,可以通过props.children来访问和渲染。

export default function ImageSlider(props) { 
    return (
      
{props.children}
); }

感谢 props.children 我们可以将内容嵌套在组件中,就像嵌套常见的 HTML 元素一样.

props.children 允许使用哪些类型的内容?

通过 props.children 传递给组件的内容可以包括

undefined、null、布尔值、数字、字符串、React 元素或任何这些类型的递归数组。它也可以是返回这些类型之一的函数。

请注意,正如 React 文档中提到的, false、null、undefined 和 true 是有效的子项,但它们将被忽略并且不会渲染。如果想要渲染 false、true、null 或 undefined,必须先将其转换为字符串:


  { String(undefined) }

为什么 props.children 如此重要?

props.children 允许我们组合组件,从而组合我们的前端界面;利用 React 组件模型的真正力量。

“React 拥有强大的组合模型,我们建议使用组合而不是继承以在组件之间重用代码。” — React 文档

正如官方文档中所述,有时您可能需要填充组件中的多个“漏洞”。在这种情况下,定义多个自定义 props 可能是更好的方法,而不是使用 props.children;如下例所示:

function SplitPane(props) {
  const { left, right } = props

  return (
    
{ left }
{ right }
); }

React.Children

“React.Children 提供了处理 props.children 不透明数据结构的实用程序” — React 文档

为什么 props.children 是一个“不透明的数据结构”?

因为 props.children 可以由一个、多个或没有子元素组成,这意味着它的值可以是单个子节点,子节点数组,或者 未定义分别。感谢 React.Children API,我们可以轻松处理 props.children,而无需考虑其每种可能的类型。值得庆幸的是,一切都会在后台为我们处理。

在撰写本文时,React.Children 提供了五种不同的实用程序

  • 地图

  • forEach

  • 数数

  • 仅有的

  • toArray

让我们通过一个例子来看看如何使用 React.Children。假设我们想要将特殊的 CSS 类 img-special-class 添加到 ImageSlider 组件的每个子组件中。这可以按如下方式完成:

export default function ImageSlider(props) {
  const { children } = props

  return (
    
{ React.Children.map(children, (child) => React.cloneElement(child, { className: `${child.props.className} img-special-class` }) ) }
); }

React.Children.map 允许我们迭代 props.children 并根据作为第二个参数传递的函数转换每个元素。为了实现我们的目标,我们使用了 React.cloneElement。这是因为我们需要更改 className prop 的值,但是 props 在 React 中是不可变的,因此我们必须克隆每个子级。

结论

掌握 props.children 对于成为一名优秀的 React 开发人员并开始充分利用 React 组件模型的潜力至关重要。 props.children 是 React 最有用的功能之一,因为它使我们能够渲染子组件。正因为如此,每个开发者都应该知道如何正确使用它。

我希望这篇文章能帮助你掌握 React 中的组合。


帖子“A Complete Guide To props.children In React”首先出现在 Writech 上。

版本声明 本文转载于:https://dev.to/writech/a-complete-guide-to-propschildren-in-react-196k?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何在PHP中强制执行文件下载并确保用户文件安全?
    如何在PHP中强制执行文件下载并确保用户文件安全?
    在 PHP 中强制文件下载如果您需要为用户提供一种从 PHP 下载图像或任何其他类型文件的方法脚本,您可以遵循一个简单的方法。提供下载链接For您想要提供下载的每个图像或文件,包括一个指向 PHP 脚本的超链接,其代码如下:<?php // File details $file...
    编程 发布于2024-12-21
  • 为什么我的 Goroutine 的值对其他人不可见?
    为什么我的 Goroutine 的值对其他人不可见?
    这是因为go编译器优化了代码吗?问题不是Go编译器优化,而是缺乏同步。对 i 的赋值后面没有任何同步事件,因此不能保证任何其他 goroutine 都会观察到它。事实上,激进的编译器可能会删除整个 i 语句。Go 内存模型Go 内存模型指定在一个变量中读取变量的条件可以保证 goroutine 观察...
    编程 发布于2024-12-21
  • 除了“if”语句之外:还有哪些地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    除了“if”语句之外:还有哪些地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    无需强制转换即可上下文转换为 bool您的类定义了对 bool 的显式转换,使您能够在条件语句中直接使用其实例“t”。然而,这种显式转换提出了一个问题:“t”在哪里可以在不进行强制转换的情况下用作 bool?上下文转换场景C 标准指定了四种值可以根据上下文转换为的主要场景bool:语句:if、whi...
    编程 发布于2024-12-21
  • 在 Go 中使用 WebSocket 进行实时通信
    在 Go 中使用 WebSocket 进行实时通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSocke...
    编程 发布于2024-12-21
  • 如何在 JavaScript 中使用数字名称访问对象属性?
    如何在 JavaScript 中使用数字名称访问对象属性?
    使用数字名称引用对象属性尽管文档建议对象文字属性名称可以是整数,但使用点语法访问这些属性(例如,me.123)失败。替代语法:数组样式访问要访问具有整数名称的对象属性,必须使用数组样式语法:me[123]此语法的行为就好像该属性是数组的元素,其中 123 是索引。String表示法或者,您可以使用字...
    编程 发布于2024-12-21
  • ## 编译器何时真正内联函数?深入探讨编译器优化。
    ## 编译器何时真正内联函数?深入探讨编译器优化。
    编译器内联函数时:深入解释在 C 语言中,编译器内联函数的能力一直是讨论的主题开发商之间。本文深入探讨了内联函数的细微差别,探讨了所涉及的底层机制和编译器优化。函数内联:编译器的自由裁量权与普遍的看法相反,函数是不仅仅基于头文件中的显式内联声明或定义进行内联。编译器具有内联它们认为必要的函数的能力,...
    编程 发布于2024-12-21
  • 如何在 PHP 中组合两个关联数组,同时保留唯一 ID 并处理重复名称?
    如何在 PHP 中组合两个关联数组,同时保留唯一 ID 并处理重复名称?
    在 PHP 中组合关联数组在 PHP 中,将两个关联数组组合成一个数组是一项常见任务。考虑以下请求:问题描述:提供的代码定义了两个关联数组,$array1 和 $array2。目标是创建一个新数组 $array3,它合并两个数组中的所有键值对。 此外,提供的数组具有唯一的 ID,而名称可能重合。要求...
    编程 发布于2024-12-21
  • 哪种复合索引最适合范围查询:高基数列与低基数列?
    哪种复合索引最适合范围查询:高基数列与低基数列?
    具有范围查询的复合索引中的高基数列放置当使用涉及范围条件的复合索引查询表时,索引中的列可以显着影响性能。考虑具有主键(did、文件名)和两个复合索引的表文件: INDEX(文件时间, ext) 和 INDEX(ext, 文件时间)。两个索引都包含 filetime 列,该列的基数高于 ext。查询:...
    编程 发布于2024-12-21
  • 如何在 PostgreSQL 中生成无间隙唯一发票编号?
    如何在 PostgreSQL 中生成无间隙唯一发票编号?
    PostgreSQL 中无间隙的唯一发票编号生成在使用需要唯一标识符(例如发票编号)的系统时,必须确保它们是一致生成的,没有任何间隙。然而,使用传统方法(例如具有序列化等隔离级别的查询)可能不够。PostgreSQL 中的序列不能保证无间隙数字,因为回滚或错误可能会消耗序列值。那么,我们如何应对这一...
    编程 发布于2024-12-21
  • 如何使用 C++11 在 Windows 中将 Unicode UTF-8 文件读取为 Wstring?
    如何使用 C++11 在 Windows 中将 Unicode UTF-8 文件读取为 Wstring?
    在 Windows 中将 Unicode UTF-8 文件读入 WStrings在 Windows 编程领域,从文件中检索 Unicode (UTF-8) 数据的任务宽字符串 (wstring) 可以通过 C 11 标准提供的通用功能来完成。利用std::codecvt_utf8 Facet该解决方...
    编程 发布于2024-12-21
  • 如何使用命令行导出MySQL数据库内容?
    如何使用命令行导出MySQL数据库内容?
    使用命令行导出MySQL数据库内容背景:导出a的内容MySQL数据库是迁移或备份数据时的一项关键任务。本文探讨如何从命令行实现此目的,提供灵活的选项用于一次导出特定数据库、表或所有数据库。使用 mysqldump 命令: mysqldump 命令专门用于导出 MySQL 数据库内容。使用方法如下:导...
    编程 发布于2024-12-21
  • 如何增加MySQL中列的字符限制?
    如何增加MySQL中列的字符限制?
    修改MySQL表中的列大小最近,您在MySQL中建立了一个表,无意中将特定列的字符限制设置为300 ,而所需的限制应该是 65,353。解决这个问题需要调整表的schema。解决方案在于执行以下SQL语句:ALTER TABLE <table_name> MODIFY <col_n...
    编程 发布于2024-12-21
  • 如何为特定 FastAPI 路由自定义错误响应?
    如何为特定 FastAPI 路由自定义错误响应?
    如何在 FastAPI 中自定义特定路由的错误响应在 FastAPI 中,引发 RequestValidationError 允许您发送自定义错误响应。这对于需要满足特定条件的端点非常有用,例如必需的标头。选项 1:覆盖默认异常处理程序此选项允许您覆盖默认异常处理程序RequestValidatio...
    编程 发布于2024-12-21
  • 尽管代码有效,为什么 POST 请求无法捕获 PHP 中的输入?
    尽管代码有效,为什么 POST 请求无法捕获 PHP 中的输入?
    解决 PHP 中的 POST 请求故障在提供的代码片段中:action=''而不是:action="<?php echo $_SERVER['PHP_SELF'];?>";?>"检查 $_POST数组:表单提交后使用 var_dump 检查 $_POST 数...
    编程 发布于2024-12-21
  • 如何使用变量在 LESS 中动态创建属性名称?
    如何使用变量在 LESS 中动态创建属性名称?
    在 LESS 中的属性名称中使用变量(动态属性/属性名称插值)LESS 目前不支持动态插入属性,尽管有关该主题的一些讨论堆栈溢出。解决方法#1:将动态生成的属性注入到属性值中This解决方法将动态创建的属性注入到硬编码的属性值中:.vendors(@property, @value, @pre: e...
    编程 发布于2024-12-21

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3