淺談 React Suspense

React Suspense 是 React 中用于處理異步操作的功能。它可以讓你"等待"某些操作,如數據獲取或組件加載完成,然后再渲染組件。Suspense 的核心理念是讓組件在準備好之前顯示一個備用的 UI,例如加載指示器,從而提高用戶體驗。

1.?基本用法

1.1. 組件懶加載

React Suspense 最常見的用法是與 React.lazy 結合,實現組件的懶加載。這對于代碼分割和優化應用性能特別有用。

import React, { Suspense } from 'react';
import ReactDOM from 'react-dom';const OtherComponent = React.lazy(() => import('./OtherComponent'));function App() {return (<div><Suspense fallback={<div>Loading...</div>}><OtherComponent /></Suspense></div>);
}ReactDOM.render(<App />, document.getElementById('root'));

在這個例子中,OtherComponent 是一個異步加載的組件,并且在它加載完成之前,會顯示 fallback 指定的內容。

優點:

1. 減少初始加載時間;

2. 按需加載組件;

3. 自動處理加載狀態;

1.2.?異步數據加載

Suspense 不僅適用于組件懶加載,還可以用于數據獲取。雖然 React 官方尚未推出內置的數據獲取 Suspense API,但可以與一些支持 Suspense 的數據獲取庫結合使用。

import React, { Suspense } from 'react';
import { fetch } from 'react-fetch';function UserProfile() {const user = fetch('/api/user').json();return (<div><h1>{user.name}</h1><p>{user.email}</p></div>);
}function App() {return (<div><Suspense fallback={<div>Loading user data...</div>}><UserProfile /></Suspense></div>);
}export default App;

在這個示例中,UserProfile 組件會等待數據獲取完成后再渲染,期間顯示加載指示器。

2.?高級用法

2.1.?嵌套 Suspense

你可以嵌套多個 Suspense 組件來處理不同部分的異步加載:

function App() {return (<div><Suspense fallback={<div>Loading header...</div>}><Header /><Suspense fallback={<div>Loading content...</div>}><Content /></Suspense></Suspense></div>);
}

2.2.?錯誤邊界

結合錯誤邊界可以更好地處理加載失敗的情況:

class ErrorBoundary extends React.Component {state = { hasError: false };static getDerivedStateFromError(error) {return { hasError: true };}render() {if (this.state.hasError) {return <h1>Something went wrong.</h1>;}return this.props.children;}
}function App() {return (<ErrorBoundary><Suspense fallback={<div>Loading...</div>}><OtherComponent /></Suspense></ErrorBoundary>);
}

2.3. 工作原理

React Suspense 的工作原理基于"可中斷渲染"的概念。當 React 遇到一個 Suspense 邊界時:

1. 首先嘗試渲染子組件;

2. 如果子組件拋出 Promise,如在數據加載或組件加載時;

3. React 會暫停該子樹的渲染;

4. 顯示 fallback UI;

5. 當 Promise 解決后,React 會重新嘗試渲染;

4.?最佳實踐

1. 有意義的加載狀態:不要只使用簡單的"Loading...",考慮使用骨架屏或進度指示器;

2. 粒度控制:將 Suspense 放在合適的層級,太大范圍會導致整個頁面顯示加載狀態;

3. 錯誤處理:始終結合錯誤邊界使用;

4. 性能優化:對于數據獲取,考慮預加載或預取數據;

5.?未來展望

React 團隊正在開發更完善的 Suspense 數據獲取方案,未來可能會:

1. 提供官方的數據獲取 Suspense API;

2. 支持更復雜的并發渲染場景;

3. 改進服務器端渲染與 Suspense 的集成;

6. 本文總結

React Suspense 是 React 并發模式的重要組成部分,它提供了一種聲明式的方式來處理異步操作。通過合理使用 Suspense,開發者可以創建更流暢的用戶體驗,更好地管理加載狀態,并實現更高效的代碼分割。

隨著 React 生態系統的不斷發展,Suspense 的應用場景將會更加廣泛,成為現代 React 應用開發中不可或缺的工具。

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

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

相關文章

機器學習的數學基礎:線性模型

線性模型 線性模型的基本形式為&#xff1a; f ( x ) ω T x b f\left(\boldsymbol{x}\right)\boldsymbol{\omega}^\text{T}\boldsymbol{x}b f(x)ωTxb 回歸問題 利用最小二乘法&#xff0c;得到 ω \boldsymbol{\omega} ω和 b b b的參數估計$ \boldsymbol{\hat{\omega}}…

Linux【4】------RK3568啟動和引導順序

引導順序 RK3568 的啟動流程如下&#xff1a; 加電后&#xff0c;芯片首先執行 BootROM 中的代碼&#xff1b; BootROM 會嘗試從配置好的外部設備&#xff08;如 NOR/NAND/eMMC/SD 卡&#xff09;加載啟動程序&#xff1b; 如果這些設備都沒有有效的啟動代碼&#xff0c;Bo…

Deepseek/cherry studio中的Latex公式復制到word中

需要將Deepseek/cherry studio中公式復制到word中&#xff0c;但是deepseek輸出Latex公式&#xff0c;比如以下Latex代碼段&#xff0c;需要通過Mathtype翻譯才能在word中編輯。 $$\begin{aligned}H_1(k1) & H_1(k) \frac{1}{A_1} \left( Q_1 u_1(k) Q_{i1} - Q_2 u_2(k…

關于iview組件中使用 table , 綁定序號分頁后序號從1開始的解決方案

問題描述&#xff1a;iview使用table 中type: "index",分頁之后 &#xff0c;索引還是從1開始&#xff0c;試過綁定后臺返回數據的id, 這種方法可行&#xff0c;就是后臺返回數據的每個頁面id都不完全是按照從1開始的升序&#xff0c;因此百度了下&#xff0c;找到了…

【機器學習】支持向量機實驗報告——基于SVM進行分類預測

目錄 一、實驗題目描述 二、實驗步驟 三、Python代碼實現基于SVM進行分類預測 四、我的收獲 五、我的感受 一、實驗題目描述 實驗題目&#xff1a;基于SVM進行分類預測 實驗要求&#xff1a;通過給定數據&#xff0c;使用支持向量機算法&#xff08;SVM&#xff09;實現分…

前端開發面試題總結-JavaScript篇(二)

文章目錄 其他高頻問題15、JS的數據類型有哪些16、如何判斷數組類型&#xff1f;17、解釋 this 的指向規則18、跨域問題及解決方案19、宏任務與微任務的區別是什么&#xff1f;列舉常見的宏任務和微任務。20、為什么微任務的優先級高于宏任務&#xff1f;設計目的是什么&#x…

硬件電路設計-開關電源設計

硬件電路設計-開關電源 電容選取設置輸出電壓電感的選取PCB布局典型電路 這里以杰華特的JW5359M 開關電源為例&#xff0c;介紹各個部分的功能電路。 當EN引腳電壓低于0.4V時&#xff0c;整個穩壓器關閉&#xff0c;穩壓器消耗的電源電流降至1μΑ以下 電容選取 1.C1和C25構成…

phosphobot開源程序是控制您的 SO-100 和 SO-101 機器人并訓練 VLA AI 機器人開源模型

?一、軟件介紹 文末提供程序和源碼下載 phosphobot開源程序是控制您的 SO-100 和 SO-101 機器人并訓練 VLA AI 機器人開源模型。 二、Overview 概述 &#x1f579;? Control your robot with the keyboard, a leader arm, a Meta Quest headset or via API &#x1f579;?…

數據通信基礎

信道特性 1.信道帶寬W ? 模擬信道&#xff1a;Wf2-f1&#xff08;f2和f1分別表示&#xff1a;信道能通過的最高/最低頻率&#xff0c;單位赫茲Hz&#xff09;。 ? 數字信道&#xff1a;數字信道是離散信道&#xff0c;帶寬為信道能夠達到的最大數據傳輸速率&#xff0c;單位…

C++與Python編程體驗的多維對比:從語法哲學到工程實踐

引言&#xff1a;語言定位的本質差異 作為靜態編譯型語言的代表&#xff0c;C以0開銷抽象原則著稱&#xff0c;其模板元編程能力可達圖靈完備級別&#xff0c;而Python作為動態解釋型語言&#xff0c;憑借鴨子類型和豐富的標準庫成為快速開發的首選。這種根本差異導致兩種語言…

TP6 實現一個字段對數組中的多個值進行LIKE模糊查詢(OR邏輯)

在ThinkPHP6中&#xff0c;可以通過以下方式實現一個字段對數組中的多個值進行LIKE模糊查詢&#xff08;OR邏輯&#xff09;&#xff1a; 1&#xff0c;使用數組形式的where條件&#xff0c;通過第三個參數指定邏輯關系&#xff1a; $where[] [字段名, like, [%值1%, %值2%]…

接口不是json的內容能用Jsonpath獲取嗎,如果不能,我們選用什么方法處理呢?

JsonPath 是一種專門用于查詢和提取 JSON 數據的查詢語言&#xff08;類似 XPath 用于 XML&#xff09;。以下是詳細解答&#xff1a; ?JsonPath 的應用場景? ?API 響應處理?&#xff1a;從 REST API 返回的 JSON 數據中提取特定字段。?配置文件解析?&#xff1a;讀取 J…

TCP/IP 與高速網絡

題目用 “與” 而不是 “是” 連接兩名詞&#xff0c;說明它們天然互斥&#xff0c;就比如看到 “經理與人” &#xff0c;自然而然的就會覺得經理接近了神。 數據在 TCP/IP 網絡上傳輸獲得的 “盡力而為” 承諾的時間在端到端時延中占比太大&#xff0c;以至于針對 TCP/IP 的…

Vue3 (數組push數據報錯) 解決Cannot read property ‘push‘ of null報錯問題

解決Cannot read property ‘push‘ of null報錯問題 錯誤寫法 定義變量 <script setup>const workList ref([{name:,value:}])</script>正確定義變量 <script setup>const workList ref([]) </script>解決咯~

React前端框架

React&#xff1a;構建現代用戶界面的范式革命&#xff08;深度解析&#xff09; 引言&#xff1a;前端開發的范式轉變 在2013年之前&#xff0c;前端開發領域被jQuery等庫主導&#xff0c;開發者通過命令式編程直接操作DOM元素。這種模式存在兩大痛點&#xff1a;代碼可維護…

Redis:string數據類型

&#x1f308; 個人主頁&#xff1a;Zfox_ &#x1f525; 系列專欄&#xff1a;Redis &#x1f525; String字符串 &#x1f9d1;?&#x1f4bb; 字符串類型是Redis最基礎的數據類型&#xff0c;關于字符串需要特別注意&#xff1a; ?先Redis中所有的鍵的類型都是字符串類…

獲取 OpenAI API Key

你可以按照以下步驟來獲取 openai.api_key&#xff0c;用于調用 OpenAI 的 GPT-4、DALLE、Whisper 等 API 服務&#xff1a; &#x1f9ed; 獲取 OpenAI API Key 的步驟&#xff1a; ? 1. 注冊或登錄 OpenAI 賬號 打開 https://platform.openai.com/ 使用你的郵箱或 Google/…

window安裝docker\docker-compose

安裝前配置 打開控制面板,參照下圖打開“啟動或關閉windows功能”,Hyper-V 和容器需要啟用 程序和功能 啟動或關閉windows功能 勾選Hyper-V 安裝路徑配置 Docker在Windows上的默認安裝路徑為C:\Program Files\Docker。 以管理員身份運行CMD在D盤,dev文件夾下創建Docker文…

Xxl-job——源碼設計思考

摘要 本文深入探討了XXL-Job框架的設計思考&#xff0c;分析了其不使用Lombok的Data注解的原因&#xff0c;包括明確控制代碼結構、避免依賴侵入、增強可維護性和調試便利性、保持編譯清晰以及遵循項目歷史和團隊編碼規范。文章還詳細介紹了XXL-Job的優化設計&#xff0c;包括…

九、【ESP32開發全棧指南: UDP通信服務端】

一、TCP與UDP核心差異 特性TCPUDP連接方式面向連接 (需三次握手)無連接可靠性可靠傳輸 (重傳/排序/校驗)盡力交付 (不保證可靠性)實時性延遲較高低延遲&#xff0c;實時性強傳輸效率協議開銷大頭部開銷小 (僅8字節)連接類型點對點支持廣播/多播資源占用高 (需維護連接狀態)極低…