React18 Transition特性詳解

Transition 核心概念:Transition是一種標記非緊急任務更新的機制,它允許React在用戶交互(如輸入)期間保持界面的響應,同時準備后臺更新

主要特點:

  • 區分優先級:可以將更新分為緊急非緊急任務
  • 可中斷渲染:Transition更新可以被更緊急的交互打斷
  • 自動降級:在不支持并發環境中自動回退到同步渲染

場景:
在Input中輸入搜索內容,過濾列表,由于數據量比較大10萬條數據導致頁面卡死
那如何處理此瓶頸:10萬條數據分頁還是利用虛擬滾動實現假性分頁。
如果把同步更新任務變成異步更新任務是不是就可以解決問題。Transition就可以處理多個并發任務

Input表單的并發任務分別為:

  • 更新Input的內容,同時會觸發更新任務(高優先級的任務)
  • Input內容改變,過濾列表,重新渲染也是一個任務(低優先級任務)

這里的任務可以分為緊急優先級任務和非緊急任務

緊急任務就是當用戶改變Input框的內容時候要立馬能夠看到更新后的內容,不然就會有卡頓、延遲。會有一種極差的視覺體驗
非緊急任務是當input輸入內容后,過濾列表并重新渲染列表,這個過程如果有延遲,用戶也是可以接受的

什么是緊急任務:直接影響用戶即時交互的界面更新,在本例中,輸入框value的更新、輸入框的光標位置、焦點狀態等
什么是非緊急任務:可以稍后處理的計算密集型或網絡請求
為什么緊急:每次用戶操作后需要立即看到輸入后的反饋,否則頓感卡頓,如果延遲處理,會導致輸入內容與顯示不一致,糟糕的用戶體驗
為什么非緊急:用戶能夠容忍短暫的結果延遲,如果與輸入框競爭資源,反而會導致輸入卡頓

Transition基本用法:

import { startTransition } from 'react';// 在事件處理中
function handleInputChange(e) {const value = e.target.value;// 緊急更新:立即更新輸入框setInputValue(value);// 非緊急更新:標記為TransitionstartTransition(() => {setSearchQuery(value); // 可能觸發大量計算的更新});
}

使用 useTransition Hook

import { useTransition } from 'react';function SearchBox() {const [isPending, startTransition] = useTransition();const handleChange = (e) => {const value = e.target.value;setInputValue(value);startTransition(() => {setSearchQuery(value);});};return (<div><input onChange={handleChange} />{isPending && <Spinner />} {/* 顯示過渡狀態 */}</div>);
}

上述案例完整代碼:

import { useState, useTransition } from 'react';function SearchComponent() {const [inputValue, setInputValue] = useState('');const [searchResults, setSearchResults] = useState([]);const [isPending, startTransition] = useTransition();// 實際項目中實現的搜索函數async function performHeavySearch(keyword) {const response = await fetch(`/api/search?q=${keyword}`);const data = await response.json();return data.items; // 根據實際API結構調整}const handleChange = async (e) => {const value = e.target.value;setInputValue(value);startTransition(async () => {const results = await performHeavySearch(value);setSearchResults(results);});};return (<div><input value={inputValue} onChange={handleChange} />{isPending ? (<div>Searching...</div>) : (<ul>{searchResults.map(item => (<li key={item.id}>{item.name}</li>))}</ul>)}</div>);
}

典型案例:

  • 搜索輸入:輸入時保持輸入框響應,搜索結果稍后顯示
  • 標簽頁切換:點擊切換標簽時立即顯示激活狀態,內容稍后加載
  • 大數據渲染:優先渲染可見部分,其他內容漸進加載

與Suspense的結合使用:Transition 可以與 Suspense 完美配合,實現流暢的異步加載體驗:

import { Suspense, useTransition } from 'react';function App() {const [resource, setResource] = useState(initialResource);const [isPending, startTransition] = useTransition();function fetchNewData() {startTransition(() => {setResource(fetchData()); // 返回一個Suspense兼容的資源});}return (<div><button onClick={fetchNewData}disabled={isPending}>{isPending ? 'Loading...' : 'Load Data'}</button><Suspense fallback={<Spinner />}> {/* Spinner 顯示過渡狀態 */}<DataDisplay resource={resource} /></Suspense></div>);
}

React中Suspense和核心功能:

1、作用:

  • 用在子組件(懶加載或異步數據請求)完成加載前顯示一個后備方案(fallback UI),例如加載動畫或者占位符
  • 支持代碼分割(通過React.lazy)和異步數據加載(需支持Suspense的庫,如react query或relay)

2、關鍵特性:

  • 代碼分割:與react.lazy結合,實現組件按需加載
  • 數據加載:需依賴Suspense庫,原生react不支持異步數據Suspense
  • 嵌套使用:允許逐步加載內容,優化用戶體驗

3、示例:

<Suspense fallback={<Loading />}><LazyComponent />  // 通過 React.lazy 加載
</Suspense>

與vue中的Suspense

1、作用

  • 處理異步組件或異步setup函數加載狀態,顯示后備內容
  • 支持任意異步邏輯(如數據請求或動態導入組件),不限于組件級懶加載

2、關鍵特性

  • 插槽設計:通過#default和#fallback插槽管理內容
  • 事件監聽:提供pending、resolve等事件、便于控制加載狀態
  • 嵌套支持:子組件的異步依賴會觸發父級Suspense的fallback

3、示例

<Suspense><template #default><AsyncComponent />  // 異步組件或含 async setup 的組件</template><template #fallback><Loading /></template>
</Suspense>

主要區別:

特性React SuspenseVue Suspense
支持范圍主要針對組件懶加載、異步數據請求、數據需要第三方支持支持任意異步邏輯(組件、數據等)
API 設計通過fallback prop定義占位內容使用插槽(#default 和 #fallback
嵌套行為內部Suspense優先處理父級的Suspense等子異步依賴完成再處理
事件監聽無內置事件通過pending、resolve、fallback等事件

vue3中Suspense中事件用法

<template><Suspense @pending="onPending"@resolve="onResolve"@fallback="onFallback"><template #default><AsyncComponent /></template><template #fallback><div>Loading...</div></template></Suspense>
</template><script setup>
import { defineAsyncComponent } from 'vue';const AsyncComponent = defineAsyncComponent(() => import('./AsyncComponent.vue')
);function onPending() {console.log('開始異步加載');// 可以在這里顯示全局加載狀態// 發送分析事件analytics.track('DashboardLoadStart');
}function onResolve() {console.log('異步加載完成');// 可以在這里隱藏全局加載狀態// 發送性能數據analytics.track('DashboardLoaded', { duration: loadTime });
}function onFallback() {console.log('Fallback內容被展示');// 可以記錄fallback顯示時間等
}
</script>

備注:這里面可以用作性能監控,當開始的時候發送事件分析,當結束時候獲得性能數據

代碼分割詳解:

代碼分割是前端性能優化中的重要技術。
代碼分割是將整個應用分割成多個小塊,然后按需加載,而不是一次性加載所有代碼,這可以:

  • 顯著減少初始加載時間
  • 降低首屏資源體積
  • 通過應用交互響應速度

傳統代碼分割問題:

// 傳統動態導入方式
import("./MyComponent.js").then(module => {// 組件加載完成后才能使用
});
  • 需要手動處理加載狀態
  • 容易導致布局跳動或空白
  • 代碼組織不夠直觀

Suspense如何分割代碼

React:

const MyComponent = React.lazy(() => import('./MyComponent'));function App() {return (<Suspense fallback={<div>Loading...</div>}><MyComponent />  {/* 被代碼分割的組件 */}</Suspense>);
}

Vue3:

<script setup>
const AsyncComp = defineAsyncComponent(() => import('./MyComponent.vue')
)
</script><template><Suspense><template #default><AsyncComp /></template><template #fallback><div>Loading...</div></template></Suspense>
</template>
  • 動態導入組件
  • 導入過程中,Suspense顯示fallback內容
  • 加載完成后,替換為實際組件

技術實現細節:
Webpack的代碼分割:當使用import()語法時,打包工具會自動:

  • 將目標分割成一個獨立的chunk文件
  • 生成運行時候加載邏輯
  • 在需要時通過 JSONP動態獲取

Suspense的協調機制:

  • React/Vue會自動追蹤異步組件加載狀態
  • 在模塊加載期間暫停渲染
  • 加載完成后重新觸發渲染

為什么需要Suspense

無Suspense有Suspense
需要手動維護loading統一處理loading
多個異步加載時狀態復雜支持嵌套異步依賴
錯誤處理困難與錯誤邊界(Error Boundaries)天然集成

性能優化技巧:

預加載策略:

// 鼠標懸停時預加載
function onLinkHover() {import('./ComponentToPrefetch');
}

命名chunks:

const Component = lazy(() => import(/* webpackChunkName: "specific-name" */ './Component'
));

Suspense嵌套:

<Suspense fallback={<AppLoader />}><Layout><Suspense fallback={<SidebarLoader />}><Sidebar /></Suspense></Layout>
</Suspense>

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

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

相關文章

OpenHarmony概述與使用

1. OpenHarmony Hi3861 學習目標與任務 硬件基礎知識&#xff1a;涵蓋嵌入式硬件體系架構&#xff08;如 MCU 基礎、硬件接口原理 &#xff09;、硬件設計流程&#xff08;原理圖繪制、PCB Layout 規范 &#xff09;&#xff0c;了解常見硬件外設&#xff08;傳感器、通信模…

大模型提示詞工程實踐:大語言模型文本轉換實踐

大模型文本轉換 學習目標 在本課程中&#xff0c;我們將探究如何使用大語言模型來完成文本轉換任務&#xff0c;例如語言翻譯、拼寫和語法檢查、語氣調整以及格式轉換。 相關知識點 大模型文本轉換 學習內容 1. 大模型文本轉換 文本轉換的核心定義與范疇 文本轉換 是指通過技術…

力扣LCR024:反轉鏈表206.反轉鏈表雙解法(經典面試題)

LCR 024. 反轉鏈表 - 力扣&#xff08;LeetCode&#xff09;LCR 024. 反轉鏈表 - 給定單鏈表的頭節點 head &#xff0c;請反轉鏈表&#xff0c;并返回反轉后的鏈表的頭節點。 示例 1&#xff1a;[https://assets.leetcode.com/uploads/2021/02/19/rev1ex1.jpg]輸入&#xff1a…

Day 6: CNN卷積神經網絡 - 計算機視覺的核心引擎

Day 6: CNN卷積神經網絡 - 計算機視覺的核心引擎 ?? 核心概念(5分鐘理解) 什么是CNN卷積神經網絡? 核心概念解釋: CNN(Convolutional Neural Network): 專門處理具有網格狀拓撲結構數據的深度學習模型,特別擅長圖像識別 為什么需要: 傳統全連接神經網絡處理圖像時參數量…

MacBook 本地化部署 Dify 指南

Dify 安裝前的準備工作 確認系統滿足最低配置要求&#xff0c;包括操作系統版本、內存、CPU 和存儲空間。 檢查是否已安裝必要的依賴項&#xff0c;如 Python、Docker 確保網絡環境穩定&#xff0c;能夠訪問所需的軟件源或鏡像倉庫。 獲取 Dify 安裝包 https://docs.dify.ai…

疫情可視化:基孔肯雅熱風險地圖實戰解析

> 一只白紋伊蚊的飛行半徑是100米,而一套WebGIS系統能將疫情防控范圍精確到每平方米。 2025年夏季,基孔肯雅熱疫情在廣東佛山爆發,短短一個月內感染病例占全省95%以上。這種由伊蚊傳播的病毒性疾病,以**突發高熱、劇烈關節痛和全身皮疹**為特征,患者關節疼痛可能持續數…

【14-模型訓練細節】

訓練步驟 1、指定輸入和輸出&#xff0c;即模型定義&#xff1b; 2、指定損失函數和成本函數&#xff1b; 3、指定訓練算法&#xff0c;如梯度下降算法&#xff1b;訓練細節 損失函數和成本函數用梯度下降算法訓練模型 主要是求成本函數的偏導數&#xff0c;使用的是反向傳播算…

ConcurrentDictionary 詳解:.NET 中的線程安全字典

什么是 ConcurrentDictionary&#xff1f; ConcurrentDictionary<TKey, TValue> 是 .NET Framework 4.0 和 .NET Core/.NET 5 中引入的線程安全字典實現&#xff0c;位于 System.Collections.Concurrent 命名空間。它解決了多線程環境下操作字典時的同步問題&#xff0c…

集成電路學習:什么是URDF Parser統一機器人描述格式解析器

URDF Parser(URDF解析器)是ROS(Robot Operating System,機器人操作系統)中用于解析URDF(Unified Robot Description Format,統一機器人描述格式)文件的工具。URDF是一種基于XML(Extensible Markup Language,可擴展標記語言)規范的格式,用于描述機器人的結構、關節、…

老式大頭顯示器(CRT)和當前最高分辨率的LED顯示器對比

老式 CRT&#xff08;陰極射線管&#xff09;和當前最頂尖的 LED&#xff08;包括 MicroLED / 高端 MiniLED / OLED&#xff09;顯示器在畫面清晰度極限相關的參數并列分析。1. 分辨率與像素密度指標老式 CRT&#xff08;PC/電視用&#xff09;頂級 LED 顯示器&#xff08;2025…

北京JAVA基礎面試30天打卡07

1. 緩存三大問題及解決方案問題場景后果常用解決方案緩存穿透請求的數據在緩存和數據庫中都不存在&#xff08;惡意攻擊或查詢異常 ID&#xff09;每次請求都會打到數據庫&#xff0c;導致 DB 壓力驟增- 緩存空值&#xff08;短期緩存不存在的 key&#xff09;- 布隆過濾器&…

后量子密碼學的遷移與安全保障:迎接量子時代的挑戰

在當今數字化時代&#xff0c;信息安全無疑是保障個人隱私、企業運營和國家安全的基石。我們依賴密碼學來保護敏感信息&#xff0c;從在線銀行交易到機密軍事通信&#xff0c;從醫療記錄的存儲到云計算中的數據傳輸&#xff0c;傳統密碼學為我們構筑起一道抵御惡意攻擊的防線。…

Android 獲取 UserAgent (UA) 的三種方式深度解析:差異、風險與最佳實踐

引言 在 Android 開發中&#xff0c;獲取 UserAgent (UA) 字符串是常見需求&#xff0c;尤其涉及網絡請求和 WebView 交互時。開發者通常使用三種方式獲取 UA&#xff1a; new WebView(context).getSettings().getUserAgentString()WebSettings.getDefaultUserAgent(context)…

Apache IoTDB 全場景部署:跨「端-邊-云」的時序數據庫 DB+AI 實戰

時序數據正成為現代工業物聯網的核心資產,從設備傳感器到業務分析,數據需跨越端、邊、云多個層級。本文將深入探討 **Apache IoTDB** 如何實現全場景統一時序數據管理,并融合AI能力實現智能決策。 --- ### 一、為什么需要「端-邊-云」協同? 在工業物聯網場景中: - **端側…

某地渣庫邊坡自動化監測服務項目

1. 項目簡介該礦山主要從事稀有金屬鉭、鈮及合金等的研發、生產、銷售和進出口業務。具有科學的管理理念、精良的工藝裝備、先進的技術水平、高素質的員工隊伍等綜合優勢&#xff0c;已形成鉭、鈮金屬及其合金材料等主要產業格局。公司產品被廣泛應用于電子、通訊、航空、航天、…

redis(2)-java客戶端使用(IDEA基于springboot)

一、準備工作首先確保&#xff1a;Linux 服務器上已安裝并啟動 Redis 服務Redis 已配置允許遠程連接&#xff08;修改 redis.conf 文件&#xff09;開發環境&#xff08;IDEA&#xff09;已準備好二、Spring Boot 項目配置 Redis1. 添加依賴在pom.xml中添加 Redis 相關依賴&…

解決 vscode 編輯 markdown 文件時退格鍵/backspace 刪除卡頓問題

文章目錄發現問題解決問題發現問題 使用 vscode 編輯 markdown 時&#xff0c;發現有時按下退格鍵 backspace 后等待很久才會生效&#xff0c;卡頓明顯 解決問題 從界面左下角的設置圖標&#xff0c;打開 vscode 的鍵盤快捷鍵設置頁面 Keyboard Shortcuts 搜索 backspace 按…

綠巨人VS Code多開項目單獨管理每個項目單獨使用一個不限制的augment

綠巨人VS Code多開項目單獨管理每個項目單獨使用一個不限制的augment 綠巨人VS前言 在AI輔助編程時代&#xff0c;Augment Code作為一款強大的代碼助手工具&#xff0c;為開發者提供了智能代碼補全、代碼生成等功能。然而&#xff0c;免費版本的使用限制&#xff08;通常為每月…

Java 之抽象類和接口

一 、抽象類 1.1 、什么是抽象類&#xff1f; 就是當一個類不能描述具體的對象時&#xff0c;那么這個類就可以寫成抽象類。比如說 Animal &#xff0c;我們知道 Animal 不能非常清楚的描述一個具體的動物&#xff0c;所以可以把 Animal 寫成抽象類。還有就是我們知道父類中的方…

【運維進階】WEB 服務器

WEB 服務器 WEB 服務器簡介 Web 服務器&#xff08;Web Server&#xff09;是指一種接收客戶端&#xff08;如瀏覽器&#xff09;發送的 HTTP 請求&#xff0c;并返回網頁內容或資源的程序或設備。它是萬維網&#xff08;WWW&#xff09;的核心組成部分。 Web 服務器的主要功能…