【React】使用Swiper報錯`Swiper` needs at least one child

問題

聊天頁面的表情面板,滑動效果使用了ant design mobile的Swiper。

原代碼中,Swiper 組件在 isShow 為 false 時渲染的是 <></>(空元素),控制臺警告Swiper needs at least one child,Swiper.Item 需要一個默認的內容,不能直接為空。

 <Swiper>{isShow ? emojiPages.map((page, pageIndex) => (<Swiper.Item key={pageIndex}><Grid columns={7} gap={8}>{page.map((item, index) => (<Grid.Itemkey={index}onClick={() => setContent(content + item.text)}><div style={{textAlign: 'center'}}>{item.text}</div></Grid.Item>))}</Grid></Swiper.Item>)) : <></>}
</Swiper>

問題分析

通過判斷 emojiPages.length > 0 來確保只有在有表情數據時才渲染 Swiper.Item,避免 Swiper 組件沒有子元素的警告。

這個警告是因為 Swiper 組件在 isShow === false 時仍然在渲染,但沒有子元素,而 antd-mobile 需要至少一個 Swiper.Item 作為子元素,否則會報錯。


解決方案

方法1. 提供一個空 Swiper.Item 作為占位

isShow === false 時,仍然渲染 Swiper.Item,但讓它保持空白:

<Swiper style={{ display: isShow ? 'block' : 'none' }}>{emojiPages.length > 0 ? (emojiPages.map((page, pageIndex) => (<Swiper.Item key={pageIndex}><Grid columns={7} gap={8}>{page.map((item, index) => (<Grid.Itemkey={index}onClick={() => setContent(prev => prev + item.text)}><div style={{ textAlign: 'center' }}>{item.text}</div></Grid.Item>))}</Grid></Swiper.Item>))) : (// ?? 這里添加一個空的 `Swiper.Item` 避免警告<Swiper.Item key="placeholder"><div style={{ height: 0, visibility: 'hidden' }}></div></Swiper.Item>)}
</Swiper>

方法2. 完全不渲染 Swiper

如果不想讓 Swiper 組件在 isShow === false 時渲染,可以用 條件渲染

{isShow && emojiPages.length > 0 && (<Swiper>{emojiPages.map((page, pageIndex) => (<Swiper.Item key={pageIndex}><Grid columns={7} gap={8}>{page.map((item, index) => (<Grid.Itemkey={index}onClick={() => setContent(prev => prev + item.text)}><div style={{ textAlign: 'center' }}>{item.text}</div></Grid.Item>))}</Grid></Swiper.Item>))}</Swiper>
)}
  • 方法 1:提供一個占位的 Swiper.Item,讓 Swiper 始終存在,但不會報錯。
  • 方法 2:在 isShow === false 時,完全不渲染 Swiper,但可能會導致 Swiper 重新初始化。

思考

方法 1(推薦):提供一個占位的 Swiper.Item

  • 優點

    • 性能優化Swiper 組件始終存在,不會被頻繁銷毀和重新初始化,避免了組件狀態的重置和性能損耗。
    • 用戶體驗:切換表情面板時不會發生過渡或初始化的閃爍,保持了流暢的交互體驗。
    • 避免報錯:通過占位的 Swiper.Item,確保 Swiper 始終有子元素,避免了警告或錯誤。
  • 缺點

    • 會占用一些不必要的空間,即使表情面板不顯示。

方法 2:在 isShow === false 時,完全不渲染 Swiper

  • 優點

    • 避免占用空間:當不顯示表情面板時,完全不渲染 Swiper,節省了頁面的布局空間。
    • 簡潔:如果你希望 Swiper 只在需要時出現,這種方式比較直接。
  • 缺點

    • 性能問題:如果切換 isShow 狀態頻繁,會導致 Swiper 組件重新初始化,這可能會影響性能,尤其是在復雜的表情面板或較大頁面的情況下。
    • 重新渲染問題:有時候切換過程中可能會導致 Swiper 狀態不一致或初始化問題。

總結:

  • 如果你的表情面板是一個經常切換的功能(比如用戶頻繁開關表情面板),建議使用 方法 1。這樣避免了 Swiper 的頻繁銷毀和初始化,能保證更流暢的用戶體驗。
  • 如果你對性能要求較高,并且表情面板的切換并不頻繁,或者你希望完全控制其占用空間,可以選擇 方法 2

個人推薦方法 1,因為它能保持組件的穩定性和流暢的交互體驗,特別是在切換時不需要重新加載內容。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/74362.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/74362.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/74362.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Matlab教程001:軟件介紹和界面使用

1.1 軟件介紹 1.1.1 Matlab的介紹 MATLAB&#xff08;MATrix LABoratory&#xff09;是一款由 MathWorks 公司開發的高級編程語言和交互式環境&#xff0c;廣泛用于 科學計算、數據分析、機器學習、工程建模、仿真和信號處理 等領域。 1.1.2 主要應用領域 數據分析與可視化…

藍橋杯算法實戰分享:算法進階之路與實戰技巧

引言 藍橋杯作為國內極具影響力的程序設計競賽&#xff0c;為眾多編程愛好者和專業人才提供了展示自我的舞臺。參與藍橋杯不僅能檢驗自身編程水平&#xff0c;還能拓寬技術視野&#xff0c;為未來職業發展積累寶貴經驗。本文將結合歷年真題與參賽經驗&#xff0c;全面分享藍橋…

Android Compose 層疊布局(ZStack、Surface)源碼深度剖析(十三)

Android Compose 層疊布局&#xff08;ZStack、Surface&#xff09;源碼深度剖析 一、引言 在 Android 應用開發領域&#xff0c;用戶界面&#xff08;UI&#xff09;的設計與實現一直是至關重要的環節。隨著技術的不斷演進&#xff0c;Android Compose 作為一種全新的聲明式…

MongoDB 面試備戰指南

MongoDB 面試備戰指南 一、基礎概念 1. MongoDB是什么類型的數據庫&#xff1f;和關系型數據庫有什么區別&#xff1f; 答案&#xff1a; MongoDB是文檔型NoSQL數據庫&#xff0c;核心區別&#xff1a; 數據模型&#xff1a;存儲JSON-like文檔&#xff08;動態schema&#xf…

毫米波雷達標定(2)

1. 前言 前面文章中介紹了產線上毫米波雷達的標定原理和流程,這篇文章則主要介紹其在線標定方法。相對于產線標定,在線標定具備使用自然場景而不是依賴特定標靶的優點,但因此其標定精度會相對差一點。在線標定一般應用于售出產品的維護場景,如果其標定結果精度可以滿足使用…

Linux fority source和__builtin_xxx

這段代碼是用于啟用和配置 GCC/Clang 的 Fortify Source 安全機制的預處理指令。Fortify Source 主要用于在編譯時增強對緩沖區溢出等內存安全問題的檢查。以下是對每一部分的詳細解釋&#xff1a; 1. 最外層條件編譯 # if CONFIG_FORTIFY_SOURCE > 0目的&#xff1a;檢查…

SQL GROUP BY 自定義排序規則

在 SQL 中&#xff0c;GROUP BY 子句用于將結果集按一個或多個列進行分組。默認情況下&#xff0c;GROUP BY 會按照列的自然順序&#xff08;如字母順序或數字順序&#xff09;進行排序。如果你需要按照自定義的排序規則對結果進行分組&#xff0c;可以使用 ORDER BY 子句結合 …

語言模型理論基礎-持續更新-思路清晰

1.預訓練 相似的任務A、B&#xff0c;任務A已經用大數據完成了訓練&#xff0c;得到模型A。 我們利用-特征提取模型的-“淺層參數通用”的特性&#xff0c;使用模型A的淺層參數&#xff0c;其他參數再通過任務B去訓練&#xff08;微調&#xff09;。 2.統計語言模型 通過條件…

ResNet與注意力機制:深度學習中的強強聯合

引言 在深度學習領域&#xff0c;卷積神經網絡&#xff08;CNN&#xff09;一直是圖像處理任務的主流架構。然而&#xff0c;隨著網絡深度的增加&#xff0c;梯度消失和梯度爆炸問題逐漸顯現&#xff0c;限制了網絡的性能。為了解決這一問題&#xff0c;ResNet&#xff08;殘差…

【C++】——C++11新特性

目錄 前言 1.初始化列表 2.std::initializer_list 3.auto 4.decltype 5.nullptr 6.左值引用和右值引用 6.1右值引用的真面目 6.2左值引用和右值引用比較 6.3右值引用的意義 6.3.1移動構造 6.4萬能引用 6.5完美轉發——forward 結語 前言 C&#xff0c;這門在系統…

【C++網絡編程】第5篇:UDP與廣播通信

一、UDP協議核心特性 1. UDP vs TCP ?特性 ?UDP?TCP連接方式無連接面向連接&#xff08;三次握手&#xff09;可靠性不保證數據到達或順序可靠傳輸&#xff08;超時重傳、順序控制&#xff09;傳輸效率低延遲&#xff0c;高吞吐相對較低&#xff08;因握手和確認機制&…

MOSN(Modular Open Smart Network)是一款主要使用 Go 語言開發的云原生網絡代理平臺

前言 大家好&#xff0c;我是老馬。 sofastack 其實出來很久了&#xff0c;第一次應該是在 2022 年左右開始關注&#xff0c;但是一直沒有深入研究。 最近想學習一下 SOFA 對于生態的設計和思考。 sofaboot 系列 SOFABoot-00-sofaboot 概覽 SOFABoot-01-螞蟻金服開源的 s…

微信小程序日常開發問題整理

微信小程序日常開發問題整理 1 切換渲染模式1.1 WebView 的鏈接在模擬器可以打開&#xff0c;手機上無法打開。 1 切換渲染模式 1.1 WebView 的鏈接在模擬器可以打開&#xff0c;手機上無法打開。 在 app.json 中看到如下配置項&#xff0c;那么當前項目就是 keyline 渲染模式…

【Altium Designer】銅皮編輯

一、動態銅皮與靜態銅皮的區分與切換 動態銅皮&#xff08;活銅&#xff09;&#xff1a; 通過快捷鍵 PG 創建&#xff0c;支持自動避讓其他網絡對象&#xff0c;常用于大面積鋪銅&#xff08;如GND或電源網絡&#xff09;。修改動態銅皮后&#xff0c;需通過 Tools → Polygo…

Java「Deque」 方法詳解:從入門到實戰

Java Deque 各種方法解析&#xff1a;從入門到實戰 在 Java 編程中&#xff0c;Deque&#xff08;雙端隊列&#xff09;是一個功能強大的數據結構&#xff0c;允許開發者從隊列的兩端高效地添加、刪除和檢查元素。作為 java.util 包中的一部分&#xff0c;Deque 接口繼承自 Qu…

ffmpeg+QOpenGLWidget顯示視頻

?一個基于 ?FFmpeg 4.x? 和 QOpenGLWidget的簡單視頻播放器代碼示例&#xff0c;實現視頻解碼和渲染到 Qt 窗口的功能。 1&#xff09;ffmpeg庫界面&#xff0c;視頻解碼支持軟解和硬解方式。 硬解后&#xff0c;硬件解碼完成需要將數據從GPU復制到CPU。優先采用av_hwf…

深入解析嵌入式內核:從架構到實踐

一、嵌入式內核概述 嵌入式內核是嵌入式操作系統的核心組件&#xff0c;負責管理硬件資源、調度任務、處理中斷等關鍵功能。其核心目標是在資源受限的環境中提供高效、實時的控制能力。與通用操作系統不同&#xff0c;嵌入式內核通常具有高度可裁剪性、實時性和可靠性&#xff…

20250324-使用 `nltk` 的 `sent_tokenize`, `word_tokenize、WordNetLemmatizer` 方法時報錯

解決使用 nltk 的 sent_tokenize, word_tokenize、WordNetLemmatizer 方法時報錯問題 第 2 節的手動方法的法1可解決大部分問題&#xff0c;可首先嘗試章節 2 的方法 1. nltk.download(‘punkt_tab’) LookupError: *******************************************************…

『 C++ 』多線程同步:條件變量及其接口的應用實踐

文章目錄 條件變量概述條件變量簡介條件變量的基本用法 案例&#xff1a;兩個線程交替打印奇偶數代碼解釋 std::unique_lock::try_lock_until 介紹代碼示例代碼解釋注意事項 std::condition_variable::wait 詳細解析與示例std::condition_variable::wait 接口介紹代碼示例代碼解…

【VolView】純前端實現CT三維重建-CBCT

文章目錄 什么是CBCTCBCT技術路線使用第三方工具使用Python實現使用前端實現 純前端實現方案優缺點使用VolView實現CBCT VolView的使用1.克隆代碼2.配置依賴3.運行4.效果 進階&#xff1a;VolView配合Python解決卡頓1.修改VtkThreeView.vue2.新增Custom3DView.vue3.Python生成s…