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

React 中 props.children 的完整指南

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

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]删除
最新教程 更多>
  • 在映射到MySQL枚举列时,如何确保冬眠保留值?
    在映射到MySQL枚举列时,如何确保冬眠保留值?
    在hibernate中保存枚举值:故障排除错误的列type ,他们各自的映射至关重要。在Java中使用枚举类型时,至关重要的是,建立冬眠的方式如何映射到基础数据库。在您的情况下,您已将MySQL列定义为枚举,并在Java中创建了相应的枚举代码。但是,您遇到以下错误:“ MyApp中的错误列类型。...
    编程 发布于2025-02-06
  • 如何干净地删除匿名JavaScript事件处理程序?
    如何干净地删除匿名JavaScript事件处理程序?
    在这里工作/},false); 不幸的是,答案是否。除非在Creation中存储对处理程序的引用。要解决此问题,请考虑将事件处理程序存储在中心位置,例如页面的主要对象,请考虑将事件处理程序存储在中心位置,否则无法清理匿名事件处理程序。 。这允许在需要时轻松迭代和清洁处理程序。
    编程 发布于2025-02-06
  • 如何从PHP中的UTF-8字符中提取UCS-2代码点?
    如何从PHP中的UTF-8字符中提取UCS-2代码点?
    [2对于给定的UTF-8字符串中的字符。为此,可以定义自定义的PHP函数。首先,了解UTF-8编码方案很重要。每个字符由1到4个字节的序列表示,具体取决于其Unicode代码点。每个字节大小的范围如下: 0xxxxx:1 byte 110xxxxxxxxxx:2 bytes 11110:4字节字...
    编程 发布于2025-02-06
  • 如何正确管理Firebase ValueEventListeners以优化应用程序性能?
    如何正确管理Firebase ValueEventListeners以优化应用程序性能?
    在firebase 在单独的线程上运行firebase valueeventlistener,从而引发了有关线程管理的关注点。为了确保有效的资源利用,应根据应用程序的生命周期进行适当时删除valueEventListeners。何时删除valueEventListeners 作为一般规则,您应在一...
    编程 发布于2025-02-06
  • 在Windows上运行Python脚本时,如何隐藏控制台窗口?
    在Windows上运行Python脚本时,如何隐藏控制台窗口?
    在python 在Python中编写IRC机器人时会出现这样的方案,在该机器人的功能中应在没有可见的控制器的情况下运行。为此,您可以使用以下简单但有效的技术:解决方案,您可以通过使用一个用一个脚本保存python脚本来抑制控制台窗口“ .pyw”扩展。示例此模式打开控制台窗口,允许访问程序的输出和...
    编程 发布于2025-02-06
  • 如何限制动态大小的父元素中元素的滚动范围?
    如何限制动态大小的父元素中元素的滚动范围?
    在交互式界面中实现垂直滚动元素的CSS高度限制 考虑一个布局,其中我们具有与可滚动的映射div一起移动的subollable map div用户的垂直滚动,同时保持其与固定侧边栏的对齐方式。但是,地图的滚动无限期扩展,超过了视口的高度,阻止用户访问页面页脚。 可以限制地图的滚动,我们可以利用CSS...
    编程 发布于2025-02-06
  • 为什么我的JSON输出中的键顺序与使用'json.dumps”的Python字典中的顺序不同?
    为什么我的JSON输出中的键顺序与使用'json.dumps”的Python字典中的顺序不同?
    [2 。但是,您注意到每个字典中的键顺序尚未预期。具体来说,您需要按键以“ id”,“ name”和“ timezone”的顺序出现。您可以使用“ sort_keys” parameter of of “ json.dumps”对输出JSON中的键进行分类。例如:导入JSON contuct.app...
    编程 发布于2025-02-06
  • 如何使用char_length()在mySQL中按字符串长度对数据进行排序?
    如何使用char_length()在mySQL中按字符串长度对数据进行排序?
    [2使用内置的char_length()function。 char_length()和length() 此查询将从指定的表中检索所有行,并基于上升顺序对它们进行排序指定列的字符长度。带有更长字符串的行将出现在结果的底部。
    编程 发布于2025-02-06
  • \“(1)vs.(;;):编译器优化是否消除了性能差异?\”
    \“(1)vs.(;;):编译器优化是否消除了性能差异?\”
    使用(1)而不是(;;)会导致无限循环的性能差异? 现代编译器,(1)和(;;)之间没有性能差异。 是如何实现这些循环的技术分析在编译器中: perl: S-> 7 8 unstack v-> 4 -e语法ok 在GCC中,两者都循环到相同的汇编代码中,如下所示:。 globl t_时 t_时...
    编程 发布于2025-02-06
  • 如何使用PHP从XML文件中有效地检索属性值?
    如何使用PHP从XML文件中有效地检索属性值?
    从php 您的目标可能是检索“ varnum”属性值,其中提取数据的传统方法可能会使您感到困惑。 - > attributes()为$ attributeName => $ attributeValue){ echo $ attributeName,'=“',$ at...
    编程 发布于2025-02-06
  • 如何从Python中的字符串中删除表情符号:固定常见错误的初学者指南?
    如何从Python中的字符串中删除表情符号:固定常见错误的初学者指南?
    从python 导入编解码器 导入 text = codecs.decode('这狗\ u0001f602'.encode('utf-8'),'utf-8') 印刷(文字)#带有表情符号 emoji_pattern = re.compile(“ [”...
    编程 发布于2025-02-06
  • 如何使用代理身份验证创建GO HTTP客户端?
    如何使用代理身份验证创建GO HTTP客户端?
    在使用Authentication 时,使用authentication时要求。当将代理支持集成到现有的第三方代码中时,这可能会构成挑战。在这种情况下,另一种方法是使用所需的代理配置创建自定义的HTTP客户端。然后,可以在第三方软件包中使用此客户端来代替默认的HTTP客户端。以下是如何使用http...
    编程 发布于2025-02-06
  • 如何使用Python的记录模块实现自定义处理?
    如何使用Python的记录模块实现自定义处理?
    使用Python的Loggging Module 确保正确处理和登录对于疑虑和维护的稳定性至关重要Python应用程序。尽管手动捕获和记录异常是一种可行的方法,但它可能乏味且容易出错。解决此问题,Python允许您覆盖默认的异常处理机制,并将其重定向为登录模块。这提供了一种方便而系统的方法来捕获和...
    编程 发布于2025-02-06
  • 如何在没有404个错误的情况下使用泽西2.0提供静态资源(例如index.html)?
    如何在没有404个错误的情况下使用泽西2.0提供静态资源(例如index.html)?
    在泽西岛估算静态资源的404错误映射拦截所有传入的请求,没有留出空间的网络容器来提供静态内容。为了解决此问题,我们深入探究了过滤器的领域,尤其是com.sun.jersey.spi.container.servlet.servlet.servlet.servletcontainer for Jer...
    编程 发布于2025-02-06
  • 我可以将加密从McRypt迁移到OpenSSL,并使用OpenSSL迁移MCRYPT加密数据?
    我可以将加密从McRypt迁移到OpenSSL,并使用OpenSSL迁移MCRYPT加密数据?
    将我的加密库从mcrypt升级到openssl 问题:是否可以将我的加密库从McRypt升级到OpenSSL?如果是这样?使用openssl?答案:可以使用mcrypt数据加密数据,可以使用openssl。关于如何使用openssl对McRypt进行加密的数据: openssl_decrypt...
    编程 发布于2025-02-06

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

Copyright© 2022 湘ICP备2022001581号-3