react 的 useTransition 、useDeferredValue

useTransition

用于 管理狀態更新的過渡(pending)狀態,避免因高優先級任務(如用戶輸入)被低優先級任務(如數據獲取或復雜計算)阻塞而導致的界面卡頓。
它特別適用于,需要 區分緊急更新和非緊急更新 的場景。

useTransition 的核心作用

  • 標記非緊急更新:
    1、允許某些狀態更新(如:數據獲取、復雜計算)被標記為“過渡”(startTransition),讓 React 知道這些更新可以延遲執行。
    2、緊急更新(如用戶輸入、動畫)會優先執行,避免界面卡頓。

  • 顯示加載狀態:
    在過渡期間,可以顯示一個加載指示器(如骨架屏、旋轉圖標),提升用戶體驗。

  • 避免不必要的渲染:
    如果過渡更新被更高優先級的更新打斷,React 會丟棄未完成的過渡更新,避免浪費資源。

基本用法

import { useState, useTransition } from 'react'function App() {const [ isPending, startTransition ] = useTransition()const [ list, setList ] = useState([])const [ inputValue, setInputValue ] = useState('')const handleInputChange = (e) => {setInputValue(e.target.value) // 緊急更新(用戶輸入)}const handleSearch = () => {startTransition(() => {// 模擬一個耗時的數據獲取操作const newList = fetchData(inputValue) // 非緊急更新(數據獲取)setList(newList)})}return (<div><inputtype="text"value={inputValue}onChange={handleInputChange}/><button onClick={handleSearch}>Search</button>{isPending && <p>Loading...</p>}  {/* 顯示加載狀態 */}<ul>{list.map((item) => (<li key={item.id}>{item.name}</li>))}</ul></div>) // end-return
}// 模擬數據獲取
function fetchData(query) {// 假設這是一個耗時操作(如 API 請求)return Array.from({ length: 1000 }, (_, i) => ({id: i,name: `${query} Item ${i}`,}))
}
  • 解析
  1. useTransition 返回一個數組:
    isPending:布爾值,表示是否有未完成的過渡更新。
    startTransition:函數,用于標記某個狀態更新為“過渡”。

  2. 緊急更新 vs. 過渡更新:
    緊急更新(如 setInputValue)會立即執行,不會被延遲。
    過渡更新(如 setList)會被標記為低優先級,React 會在空閑時執行。

  3. isPending 的作用
    在過渡期間,isPending 為 true,可以用于顯示加載狀態(如 Loading…)。

  4. startTransition 的使用
    將耗時操作包裹在 startTransition 中,告訴 React 這是非緊急更新。

總之

  • useTransition 是 React 18 提供的優化工具,用于 區分緊急和非緊急更新,避免界面卡頓。
  • isPending 可以用于顯示加載狀態,提升用戶體驗。
  • startTransition 用于標記非緊急更新,讓 React 知道可以延遲執行。

如果你的應用中有 耗時操作(如:數據獲取、復雜計算),并且希望 避免阻塞用戶交互useTransition 是一個非常好的選擇! 🚀




useDeferredValue

useDeferredValue 的核心作用

  1. 延遲低優先級更新

    • 當某個狀態(如:輸入框的值)變化時,React 會優先處理高優先級任務(如:用戶輸入),而延遲處理低優先級任務(如:列表渲染)。
    • 避免因列表渲染導致輸入框卡頓。
  2. 自動管理優先級

    • 不需要手動調用 startTransitionuseDeferredValue 會自動決定何時延遲更新。
  3. 避免不必要的渲染

    • 如果輸入值快速變化(如:用戶連續輸入),React 會丟棄未完成的低優先級更新,避免浪費資源。

基本用法

import { useState, useDeferredValue } from 'react'function SearchResults() {const [ query, setQuery ] = useState('')const deferredQuery = useDeferredValue(query)  // 延遲更新后的值const [ list, setList ] = useState([])// 模擬數據獲取(耗時操作)const fetchData = (q) => {return Array.from({ length: 1000 }, (_, i) => ({id: i,name: `${q} Item ${i}`,}))}// 當 deferredQuery 變化時,更新列表// (但不會阻塞用戶輸入)React.useEffect(() => {setList(fetchData(deferredQuery))}, [deferredQuery])return (<div><inputtype="text"value={query}onChange={(e) => setQuery(e.target.value)}placeholder="Search..."/><ul>{list.map((item) => (<li key={item.id}>{item.name}</li>))}</ul></div>) // end-return
}
  1. useDeferredValue 返回一個延遲的值

    • deferredQueryquery 的延遲版本,React 會在空閑時更新它。
    • 用戶輸入(query 變化)是緊急更新,會立即響應。
    • 列表渲染(基于 deferredQuery)是低優先級更新,會延遲執行。
  2. 自動優化性能

    • 如果用戶快速輸入,React 會丟棄未完成的 deferredQuery 更新,避免浪費資源。
    • 只有當用戶停止輸入或輸入速度變慢時,才會執行低優先級更新。
  3. 適用場景

    • 搜索框 + 動態列表:用戶輸入時,列表渲染不會阻塞輸入。
    • 過濾/排序大數據:用戶調整篩選條件時,列表更新不會卡頓。

優化后的代碼示例(帶加載狀態)

import { useState, useDeferredValue, useEffect } from 'react'function SearchResults() {const [ query, setQuery ] = useState('')const deferredQuery = useDeferredValue(query)const [ list, setList ] = useState([])const [ isLoading, setIsLoading ] = useState(false)useEffect(() => {setIsLoading(true)const timer = setTimeout(() => {setList(Array.from({ length: 1000 }, (_, i) => ({id: i,name: `${deferredQuery} Item ${i}`,})))setIsLoading(false)}, 300)return () => clearTimeout(timer)  // 清理未完成的更新}, [deferredQuery])return (<div><inputtype="text"value={query}onChange={(e) => setQuery(e.target.value)} />{isLoading && <p>Loading...</p>}<ul>{list.map((item) => (<li key={item.id}>{item.name}</li>))}</ul></div>) // end-return
}

總結

  • useDeferredValue 是 React 18 提供的優化工具,用于 延遲低優先級狀態更新,避免阻塞用戶交互。
  • 適用場景:輸入框關聯的動態內容(如搜索建議、過濾列表)。
  • 優勢
    • 自動管理優先級,無需手動調用 startTransition
    • 避免因低優先級任務導致界面卡頓。
    • 提升用戶體驗,特別是在輸入場景下。

如果你的應用中有 輸入框 + 動態列表 的交互,useDeferredValue 是一個非常合適的優化方案! 🚀

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

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

相關文章

Unity的GameObject.Instantiate的使用

在Unity游戲引擎中&#xff0c;GameObject.Instantiate 是一個核心方法&#xff0c;用于在運行時動態創建游戲對象的副本。它常用于實例化預制體&#xff08;Prefab&#xff09;&#xff0c;例如生成敵人、子彈或場景元素。以下是其使用方法的詳細說明&#xff0c;包括語法、參…

【CSS】盒子類型

CSS盒子模型是網頁布局的核心基礎&#xff0c;每個HTML元素都被視為一個矩形盒子&#xff0c;由??內容&#xff08;Content&#xff09;、內邊距&#xff08;Padding&#xff09;、邊框&#xff08;Border&#xff09;、外邊距&#xff08;Margin&#xff09;??四部分組成。…

《嵌入式C語言筆記(十五):字符串操作與多維指針深度解析》

1.字符串與指針安全操作核心函數與陷阱函數功能安全替代功能strcpy字符串拷貝strncpy復制前n個&#xff0c;最多strlen個&#xff0c;超出有效長度&#xff0c;按原樣復制strcat字符串拼接strncatdest只連接src的前n個&#xff0c;如果n超過有效長度&#xff0c;按原樣鏈接strc…

每日學習筆記記錄(分享更新版-凌亂)

函數和變量都需要滿足&#xff1a;先聲明后使用&#xff08;重要&#xff09;在 函數的聲明中&#xff0c;形參的名字可以省略函數的定義是一種特殊的是聲明&#xff0c;比聲明更加強大&#xff1b;函數使用前必須進行聲明&#xff0c;但不必要聲明具體定義.h——函數的聲明.c—…

Windows提權(MS09-012 巴西烤肉)

演示環境&#xff1a;windows-2003前提&#xff1a;提權的前提條件是拿到服務器的webshell演示以iis的中間件解析漏洞為例&#xff08;test.asp;.jpg&#xff09; Windows提權拿到webshell之后&#xff0c;使用菜刀&#xff0c;蟻劍&#xff0c;冰蝎或者哥斯拉連接上服務器&…

常見依賴于TCP/IP的應用層協議

Protocol 協議 Acronym 縮寫 Port 端口 Description 描述 Telnet Telnet 23 Remote login service 遠程登錄服務 Secure Shell SSH 22 Secure remote login service 安全遠程登錄服務 Simple Network Management Protocol 簡單網絡管理協議 SNMP 161-162 Manage network d…

XML Schema 指示器:全面解析與深度應用

XML Schema 指示器:全面解析與深度應用 引言 XML Schema 是一種用于定義 XML 文檔結構的語言,它為 XML 文檔提供了嚴格的框架,以確保數據的準確性和一致性。在本文中,我們將深入探討 XML Schema 的基本概念、關鍵特性、指示器的作用以及其實際應用。 XML Schema 的基本概…

13、select_points_object_model_3d解析

名字 select_points_object_model_3d- 將閾值應用于 3D 對象模型的屬性。 簽名 select_points_object_model_3d( : : ObjectModel3D, Attrib,

ThinkPHP6.1+Ratchet庫 搭建websocket服務

Ratchet 是一個基于 ReactPHP 的 PHP WebSocket 庫&#xff0c;無需依賴 Swoole 擴展。以下是實現步驟&#xff1a;首先安裝 Ratchet&#xff1a;composer require cboden/ratchet創建 WebSocket 處理類&#xff1a;<?php /*** websocket處理類* DateTime 2025/7/28 10:38…

智慧工地系統:科技如何重塑建筑現場?

前幾天路過一個正在施工的樓盤&#xff0c;看到現場雖然機器轟鳴&#xff0c;但秩序井然&#xff0c;工人們佩戴著設備&#xff0c;指揮塔上閃爍著指示燈&#xff0c;和印象中那種塵土飛揚、雜亂無章的工地景象完全不同。當時就感慨&#xff0c;現在工地也“智慧”起來了。后來…

Day 25:異常處理

Day 25: Python異常處理機制 Review 上一節主要是熟悉os等python中的文件操作&#xff0c;包含&#xff1a; 基礎操作&#xff1a;目錄獲取、文件列舉、路徑拼接系統交互&#xff1a;環境變量管理、跨平臺兼容性高級功能&#xff1a;目錄樹遍歷、文件系統分析 Today 今天專…

Apache Ignite 的分布式隊列(IgniteQueue)和分布式集合(IgniteSet)的介紹

以下的內容是關于 Apache Ignite 的分布式隊列&#xff08;IgniteQueue&#xff09;和分布式集合&#xff08;IgniteSet&#xff09; 的介紹。它們是 Ignite 提供的分布式數據結構&#xff0c;讓你可以在整個集群中像使用本地 BlockingQueue 或 Set 一樣操作共享的數據。 下面我…

HTML5 `<figure>` 標簽:提升網頁語義化與可訪問性的利器

目錄什么是 <figure> 標簽&#xff1f;為什么我們要用 <figure>&#xff1f;<figure> 標簽的語法<figure> 標簽的適用場景1 圖片及其說明 (最常用)2 代碼片段及其注釋3 圖表、流程圖或數據可視化4 引用或引文 (Quote) 及其出處總結在現代網頁開發中&am…

計算機網絡五層模型

我們常說的“計算機網絡五層協議模型”&#xff0c;是一個實際應用中廣泛采用的簡化模型&#xff08;介于OSI七層&#xff08;Open System Interconnect&#xff09;與TCP/IP四層之間&#xff09;&#xff0c;用于描述網絡通信中各層的職責與作用。 文章目錄第5層&#xff1a;應…

數據開源 | “白虎”數據集首批開源,邁出百萬數據征途第一步

“白虎”數據集首批開源 在機器人智能不斷邁向自主化、通用化的進程中&#xff0c;如何解決人形機器人的“喂養”難題、走出“數據荒漠”&#xff0c;已成為具身智能領域亟需攻克的關鍵課題。為此&#xff0c;2025 年初&#xff0c;全國首個異構人形機器人訓練場在模力社區正式…

第17章——多元函數積分學的預備知識

文章目錄思維導圖場論初步方向導數梯度散度與旋度今日格言&#xff1a;如果凡事缺少了實行的勇氣&#xff0c;再有智慧與仁愛也是枉然。思維導圖 場論初步 場就是空間區域ΩΩΩ上的一種對應法則。可分為&#xff1a;數量場和向量場。 比如一個數量函數uu(x,y,z)uu(x,y,z)uu(x…

Vue》》Slot 插槽

插槽的概念 插槽就是子組件中的提供給父組件使用的一個占位符&#xff0c;用slot標簽 表示&#xff0c;父組件可以在這個占位符中填充任何模板代碼&#xff0c;如 HTML、組件等&#xff0c;填充的內容會替換子組件的slot標簽。簡單理解就是子組件中留下個“坑”&#xff0c;父組…

AKS部署.Net Shopping(K8S本地部署/AKS部署/key-value)

文章目錄 項目地址 一、Api配置修改 1.1 配置docker 1. docker-compose配置環境變量 2. 修改appsettings 二、本地k8s部署 2.1 將本地鏡像Push到dockerHub 2.2 制作K8S yaml文件 1. mogodb 2. shopping api 3. shoppingclient 3. port補充 4. Service 的type 三、部署到AKS 3.1…

vue3 el-table 去除小數

在 Vue 3 中使用 Element Plus 的 <el-table> 組件時&#xff0c;如果你希望去除表格列中的小數&#xff0c;你可以通過幾種方式來實現&#xff1a;1. 使用 formatter 屬性<el-table-column> 組件的 formatter 屬性允許你自定義單元格的顯示格式。你可以使用這個屬…

JavaScript數組去重性能優化:Set與Object哈希表為何效率最高

文章目錄 數組去重性能優化:為什么Set和Object哈希表的效率最高 引言 一、數組去重的常見方法 1.1 雙重循環法 1.2 indexOf/includes方法 1.3 排序后相鄰比較法 1.4 filter + indexOf方法 1.5 使用Set數據結構 1.6 使用Object哈希表 二、性能對比分析 2.1 時間復雜度對比 2.2 …