網站首頁 編程語言 正文
解決React報錯React.Children.only?expected?to?receive?single?React?element?child_React
作者:chuck ? 更新時間: 2023-02-14 編程語言總覽
當我們把多個子元素傳遞給一個只期望有一個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的消費者在使用該組件時只提供一個子元素。
原文鏈接:https://juejin.cn/post/7179606722162950199
相關推薦
- 2022-04-19 C語言內存管理及初始化細節示例詳解_C 語言
- 2022-08-14 .Net使用日志框架NLog_實用技巧
- 2022-07-09 Harbor鏡像倉庫搭建
- 2023-01-30 C++指針和數組:字符和字符串、字符數組的關聯和區別_C 語言
- 2022-01-10 Layui碰上Thymeleaf的解析問題
- 2022-09-08 pandas實現datetime64與unix時間戳互轉_python
- 2022-10-07 react性能優化useMemo與useCallback使用對比詳解_React
- 2022-07-03 C++超詳細講解隱藏私有屬性和方法的兩種實現方式_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支