总览

当我们把多个子元素传递给一个只期望有一个React子元素的组件时,会产生"React.Children.only expected to receive single React element child"错误。为了解决该错误,将所有元素包装在一个React片段或一个封闭div中。

这里有个示例来展示错误是如何发生的。

// App.js

import React from 'react';

function Button(props) {
// ️ expects single child element
return React.Children.only(props.children);
} export default function App() {
return (
<Button>
<button
onClick={() => {
console.log('Button clicked');
}}
>
Click
</button>
<button
onClick={() => {
console.log('Button clicked');
}}
>
Click
</button>
</Button>
);
}

Button元素期望传递单个子元素,但我们在同级下传递了2个子元素。

React片段

我们可以使用React片段来解决该错误。

import React from 'react';

function Button(props) {
// ️ expects single child element
return React.Children.only(props.children);
} export default function App() {
return (
<Button>
<>
<button
onClick={() => {
console.log('Button clicked');
}}
>
Click
</button>
<button
onClick={() => {
console.log('Button clicked');
}}
>
Click
</button>
</>
</Button>
);
}

当我们需要对子节点列表进行分组,而不需要向DOM添加额外的节点时,就会使用Fragments

你可能还会看到使用了更详细的片段语法。

import React from 'react';

function Button(props) {
// ️ expects single child element
return React.Children.only(props.children);
} export default function App() {
return (
<Button>
<React.Fragment>
<button
onClick={() => {
console.log('Button clicked');
}}
>
Click
</button>
<button
onClick={() => {
console.log('Button clicked');
}}
>
Click
</button>
</React.Fragment>
</Button>
);
}

上面的两个例子达到了相同的结果--它们对子元素列表进行分组,而没有向DOM中添加额外的节点。

现在大多数代码编辑器都支持更简明的语法,因此更常用。

DOM元素

另一个解决方案是将子元素包裹在另一个DOM元素中,例如一个div

import React from 'react';

function Button(props) {
// ️ expects single child element
return React.Children.only(props.children);
} export default function App() {
return (
<Button>
<div>
<button
onClick={() => {
console.log('Button clicked');
}}
>
Click
</button>
<button
onClick={() => {
console.log('Button clicked');
}}
>
Click
</button>
</div>
</Button>
);
}

这样就解决了错误,因为我们现在向Button组件传递了单一的子元素。

这种方法只有在添加一个额外的div而不会破坏你的布局时才有效,否则就使用一个片段,因为片段不会向DOM添加任何额外的标记。

这是很有必要的,因为Button组件使用React.Children.only函数来验证children属性是否只有一个子元素,并返回它。否则该方法会抛出一个错误。

React.Children.only方法经常被用于第三方库,以确保API的消费者在使用该组件时只提供一个子元素。

最新文章

  1. commons configuration管理项目的配置文件
  2. SQL练习题
  3. 内核移植和文件系统制作(3)Ramdisk简介和常见问题
  4. UEditor和CKEditor配置上传图片,视频,附件
  5. WAP调用微信支付https://pay.weixin.qq.com/wiki/doc/api/wap.php?chapter=15_1
  6. FOR XML PATH 转换问题
  7. html中如何修改选中 用input做的搜索框 的边框颜色
  8. mysql之数据库的增删改查
  9. linux 服务配置
  10. Redis实战 - 4.Key
  11. javascript闭包和this对象
  12. List集合的总结和应用场景的介绍
  13. 魔术方法__get()、__set()和__call()的用法
  14. jQuery之$.ajax()方法详解及实例
  15. js精度误差
  16. 【web】a标签点击时跳出确认框
  17. JS获取用户的Ip地址
  18. C#调用DLL各种传参
  19. VMTurbo采用红帽企业虚拟化软件
  20. Python操作mysql之模块pymysql

热门文章

  1. 轻量级Web框架Flask——Web表单
  2. HYSBZ1036 [ZJOI2008]树的统计(树链剖分)
  3. 谣言检测()《Data Fusion Oriented Graph Convolution Network Model for Rumor Detection》
  4. Spring Boot 源码学习之转载
  5. qiankun+vue,为什么我的子应用的子路由老是跳404?这么解决
  6. Oracle注入
  7. String类型变量的使用
  8. C语言------数据类型与输入输出
  9. jstl的使用 转发和重定向(做项目遇到的一些问题总结)
  10. 关于针对XSS漏洞攻击防范的一些思考