React 性能優化實戰:用useTransition解決卡頓問題

文章目錄

  • 1. 概述
  • 2. 基本原理與語法
  • 3. 應用場景
    • 3.1 數據密集型界面的更新優化
    • 3.2 動態內容切換的平滑過渡
    • 3.3 搜索與過濾結果的實時展示
  • 4. 與其他相關Hook的對比
  • 5. 結合Suspense使用
  • 6. 注意事項

1. 概述

useTransition Hook 。它允許開發者將一些非緊急的 UI 更新標記為 “過渡更新”,與緊急的用戶交互(如輸入框輸入、按鈕點擊)區分開來,確保用戶操作的即時響應,同時在空閑時間處理那些相對不那么急迫的更新,從而提升應用的整體流暢度。

2. 基本原理與語法

useTransition 的核心原理基于 React 的并發模式(Concurrent Mode)。在并發模式下,React 可以暫停、中止或重新啟動渲染任務,根據任務的優先級靈活調度。useTransition 會將更新任務標記為低優先級,使得高優先級的用戶交互事件能夠優先得到處理,避免界面出現假死或卡頓現象。

在語法使用上,useTransition 需要從 react 庫中導入,它返回兩個值:一個用于標記過渡狀態的布爾值 isPending 和一個啟動過渡更新的函數 startTransition。具體示例如下:

import React, { useState, useTransition } from'react';function App() {const [isOpen, setIsOpen] = useState(false);const [isPending, startTransition] = useTransition();const handleToggle = () => {startTransition(() => {setIsOpen(!isOpen);});};return (<div><button onClick={handleToggle}>{isPending? 'Loading...' : isOpen? 'Close' : 'Open'}</button>{isOpen && (<div>{/* 此處為復雜的UI內容 */}</div>)}</div>);
}

在上述代碼中,點擊按鈕觸發的狀態更新被包裝在 startTransition 函數中,成為過渡更新。isPending 可以用來在過渡更新進行時,展示加載狀態,提示用戶操作正在處理中。

3. 應用場景

useTransition 適用于以下場景:

3.1 數據密集型界面的更新優化

在一些數據密集型的應用中,如大數據表格展示、復雜圖表切換等場景,數據的更新往往會帶來大量的 UI 重新渲染,容易造成界面卡頓。以大數據表格為例,當用戶切換頁面或篩選數據時,表格內容需要重新渲染。此時,使用 useTransition 將表格數據的更新標記為過渡更新,就能保證用戶點擊切換或篩選操作的即時響應,不會出現點擊后界面無反應的情況。同時,在 React 空閑時,會逐步完成表格數據的更新渲染,用戶幾乎感受不到明顯的延遲,極大提升了數據操作的流暢體驗。

3.2 動態內容切換的平滑過渡

對于包含多個內容區域切換的應用,如多步驟表單、選項卡式界面等,內容切換時的過渡效果直接影響用戶體驗。比如在一個多步驟注冊表單中,當用戶點擊 “下一步” 按鈕,頁面需要加載新的表單內容和驗證邏輯,這可能涉及到大量的狀態更新和 UI 重新渲染。通過 useTransition,可以將這種內容切換的更新設置為過渡更新,在用戶點擊按鈕的瞬間,立即給出反饋(如顯示加載動畫),同時在后臺逐步完成新內容的渲染和更新,使得內容切換過程更加平滑,減少用戶等待的焦慮感。

3.3 搜索與過濾結果的實時展示

在搜索框或篩選條件較多的應用中,用戶輸入關鍵詞或選擇篩選條件后,應用需要實時展示匹配的結果。如果搜索或過濾邏輯復雜,涉及大量數據的處理和 UI 更新,直接更新界面可能會導致輸入卡頓。利用 useTransition,將搜索結果的更新作為過渡更新,在用戶輸入時,界面能夠保持流暢的響應,實時接收用戶的輸入內容。當用戶停止輸入或操作完成后,React 再進行搜索結果的更新渲染,確保用戶在操作過程中始終能獲得流暢的交互體驗。

4. 與其他相關Hook的對比

在 React 的 Hook 體系中,useTransitionuseDeferredValue 都可用于處理非緊急更新,但它們的使用場景和機制存在差異。useDeferredValue 聚焦于延遲單個值的更新,比如在輸入框輸入場景中,當用戶快速輸入時,若對輸入值的處理涉及復雜計算或會觸發大量 UI 渲染,直接更新會導致卡頓。此時使用 useDeferredValue 可以創建一個“延遲”版本的值,先快速響應用戶輸入,在輸入暫停后再進行復雜處理和更新。

useTransition 更側重于將整個更新過程標記為過渡,適用于包含多個狀態變化的復雜更新場景。例如在數據密集型表格的篩選操作中,不僅涉及數據狀態的改變,還會引發表格組件的重新渲染等多個狀態變化,這種情況下 useTransition 能更好地將其標記為低優先級更新,保障用戶交互的即時性。

此外,useMemouseTransition 的作用也有所不同。useMemo 主要用于緩存函數的計算結果,避免在不必要的時候重新計算,從而優化性能;useTransition 則著重于調度更新任務的優先級,兩者在性能優化的側重點上有著本質區別 。

5. 結合Suspense使用

useTransition 可以和 Suspense 配合使用,進一步提升用戶體驗。在過渡更新過程中,如果涉及到異步數據獲取(如從 API 拉取數據),可以用 Suspense 包裹相關組件,并設置 fallback 顯示加載狀態。

例如,在一個展示用戶列表的頁面中,當用戶觸發篩選操作時,使用 useTransition 將篩選后的列表更新標記為過渡更新,同時列表數據需要從后端接口獲取,此時用 Suspense 包裹列表組件:

import React, { useState, useTransition, Suspense } from'react';function UserList() {// 模擬異步獲取用戶列表數據const fetchUsers = () => new Promise((resolve) => setTimeout(() => resolve([/* 模擬用戶數據 */])), 1000);return (<Suspense fallback={<div>Loading users...</div>}>{fetchUsers().then((users) => (<ul>{users.map((user) => (<li key={user.id}>{user.name}</li>))}</ul>))}</Suspense>);
}function App() {const [showAllUsers, setShowAllUsers] = useState(true);const [isPending, startTransition] = useTransition();const handleToggle = () => {startTransition(() => {setShowAllUsers(!showAllUsers);});};return (<div><button onClick={handleToggle}>{isPending? 'Loading...' : showAllUsers? 'Show Filtered Users' : 'Show All Users'}</button>{showAllUsers && <UserList />}</div>);
}

在上述代碼中,用戶點擊按鈕觸發的篩選操作是過渡更新,Suspense 在異步獲取用戶列表數據時展示加載狀態,無論是過渡更新的等待,還是異步數據加載的等待,都能以統一的方式向用戶展示友好的反饋界面 。

6. 注意事項

  • useTransition 僅在 React 的并發模式下生效,目前在開發環境中默認開啟,但在生產環境中,需要手動配置才能啟用并發模式,否則 useTransition 可能無法達到預期效果。

  • 雖然 useTransition 能優化非緊急更新,但不能濫用。對于一些對實時性要求極高的狀態更新,如實時計數、動畫控制等,不應使用 useTransition 進行標記,否則可能會出現視覺上的延遲或不同步現象。

  • 在使用 isPending 狀態來展示加載效果時,要合理設計加載提示的樣式和位置,避免遮擋重要信息,同時確保提示能夠清晰傳達操作正在進行的狀態,提升用戶體驗。

  • 由于過渡更新的優先級較低,在某些極端情況下,如果系統資源緊張,過渡更新可能會被長時間延遲甚至中止。因此,在處理重要數據或關鍵業務邏輯相關的更新時,需要謹慎評估是否適合使用 useTransition,必要時可以結合其他優化手段,如數據分片加載、虛擬滾動等,共同提升應用性能。

useTransition 就像是一位智能的任務調度員,合理安排 UI 更新任務,讓用戶操作與界面渲染和諧共存。


本次分享就到這兒啦,我是鵬多多,如果您看了覺得有幫助,歡迎評論,關注,點贊,轉發,我們下次見~

往期文章

  • vue中ref的詳解以及react的ref對比
  • css使用aspect-ratio制作4:3和9:16和1:1等等比例布局
  • Web前端頁面開發阿拉伯語種適配指南
  • flutter-使用extended_image操作圖片的加載和狀態處理以及緩存和下載
  • flutter-制作可縮放底部彈出抽屜評論區效果
  • flutter-實現Tabs吸頂的PageView效果
  • Vue2全家桶+Element搭建的PC端在線音樂網站
  • 助你上手Vue3全家桶之Vue3教程
  • 超詳細!vue組件通信的10種方式
  • 超詳細!Vuex手把手教程
  • 使用nvm管理node.js版本以及更換npm淘寶鏡像源
  • vue中利用.env文件存儲全局環境變量,以及配置vue啟動和打包命令

個人主頁

  • CSDN
  • GitHub
  • 掘金

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

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

相關文章

基于Rust紅巖題材游戲、汽車控制系統、機器人運動學游戲實例

根據紅巖題材設計的關鍵游戲實例 以下是根據紅巖題材設計的關鍵游戲實例,結合Rust語言特性(如安全并發、ECS架構等)的框架性方案。所有設計均需符合Rust語法規范,實際開發需配合游戲引擎(如Bevy、Amethyst)。 核心系統模塊 // ECS架構示例(Bevy引擎) use bevy::prel…

【ZYNQ Linux開發】BRAM的幾種驅動方式

1 Vivado配置 ? BRAM 的使用方法為使用 AXI BRAM 控制器來控制 BRAM 生成器&#xff0c;Block Design 連接如下&#xff1a; 我這里配置的是真雙端口 RAM&#xff0c;通過 PL 的邏輯對 BRAM 生成器的端口 B 進行寫操作&#xff0c;在 PS 端對端口 A 進行讀。 BRAM 控制…

Flink ClickHouse 連接器數據寫入源碼深度解析

一、引言 在大數據處理的實際應用場景中&#xff0c;數據的高效存儲與處理至關重要。Flink 作為一款強大的流式計算框架&#xff0c;能夠對海量數據進行實時處理&#xff1b;而 ClickHouse 作為高性能的列式數據庫&#xff0c;擅長處理大規模數據分析任務。Flink ClickHouse 連…

OpenCV 人臉分析------面部關鍵點檢測類cv::face::FacemarkLBF

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 使用 Local Binary Features (LBF) 算法進行面部關鍵點檢測&#xff08;facial landmark detection&#xff09;。該算法通過級聯回歸樹預測人臉的…

Netstat高級分析工具:Windows與Linux雙系統兼容的精準篩查利器

Netstat高級分析工具&#xff1a;Windows與Linux雙系統兼容的精準篩查利器在網絡安全運維中&#xff0c;快速識別可疑連接是防御入侵的關鍵一步。本文將介紹一款我本人開發的原創高效的雙系統兼容Netstat信息分析工具&#xff0c;大幅提升惡意連接篩查效率。一、Netstat分析在安…

Bright Data MCP+Trae :快速構建電商導購助手垂直智能體

聲明&#xff1a;本測試報告系作者基于個人興趣及使用場景開展的非專業測評&#xff0c;測試過程中所涉及的方法、數據及結論均為個人觀點&#xff0c;不代表任何官方立場或行業標準。 文章目錄 一、引言1.1 當前AI智能體的趨勢1.2 構建智能體面臨的最大挑戰&#xff1a;數據來…

plantuml用法總結

時序圖 參考 https://blog.csdn.net/vitaviva/article/details/120735745用PlantUML簡化復雜時序圖的秘訣 startuml skin rose actor User as user participant "Component A" as A participant "Component B" as Buser -> A: Request data activate …

基于自研心電芯片國產化手持單導/6導/12導心電解決方案

蘇州唯理作為國內心電芯片國產化廠商&#xff0c;面向家用場景&#xff0c;推出了國產化的手持單導/6導/12導心電儀技術解決方案&#xff0c;可以讓家用心電圖儀成本可控&#xff0c;信號鏈路質量更佳穩定。該方案已在多家客戶中實現批量出貨。唯理科技同樣提供了醫療級的心電圖…

Sass詳解:功能特性、常用方法與最佳實踐

Sass詳解&#xff1a;功能特性、常用方法與最佳實踐 Sass&#xff08;Syntactically Awesome Style Sheets&#xff09;作為CSS預處理器領域的先驅&#xff0c;自2006年由Hampton Catlin創建以來&#xff0c;已成為現代前端開發中不可或缺的工具。它通過引入變量、嵌套、混合宏…

vulnhub靶機滲透:PWNLAB: INIT

一、信息收集1、主機發現2、端口掃描PORT STATE SERVICE VERSION 80/tcp open http Apache httpd 2.4.10 ((Debian))111/tcp open rpcbind 2-4 (RPC #100000)3306/tcp open mysql MySQL 5.5.47-0deb8u151649/tcp open status 1 (RPC #100024)3、目錄掃描&…

LiveKit 本地部署全流程指南(含 HTTPS/WSS)

1. 環境準備 操作系統&#xff1a;Windows 10/11 或 Linux/Mac需有本地公網/內網 IP&#xff08;如 192.168.x.x&#xff09;推薦瀏覽器&#xff1a;Chrome/Edge/Firefox/Safari端口未被占用&#xff0c;防火墻允許相關端口 2. 目錄結構建議 livekit/livekit-server.execonf…

NumPy-統計函數詳解

NumPy-統計函數詳解一、基礎統計函數&#xff1a;均值、方差、標準差1. 全局統計&#xff1a;忽略維度的整體計算2. 按軸統計&#xff1a;指定維度方向的計算二、位置統計&#xff1a;中位數、分位數、百分位數1. 中位數計算2. 分位數與百分位數三、離散程度&#xff1a;極差、…

音頻被動降噪技術

音頻被動降噪技術 音頻被動降噪技術是一種通過物理結構和材料設計來減少或隔離外部噪聲的降噪方式,其核心原理是通過物理屏障或吸聲材料來阻斷或吸收聲波,從而降低環境噪聲對聽覺體驗的影響。以下將從技術原理、應用場景、優缺點及與其他降噪技術的對比等方面進行詳細分析。…

中國蟻劍使用方法

找到mysql配置文件 secure-file-priv工作目錄 D:\tool\huli\gui_webshell\AntSword\AntSword\antSword-master重點是tool目錄后面 前面大家可能都不一樣 添加數據一句話木馬 3C3F706870206576616C28245F504F53545B22636D64225D293B3F3E 翻譯過來 <?php eval($_POST["c…

8.1 prefix Tunning與Prompt Tunning模型微調方法

1 prefix Tunning 鏈接&#xff1a;https://blog.csdn.net/m0_66890670/article/details/142942034 這里有基礎的細節介紹。我下面直接總結。 連接2 &#xff1a;https://zhuanlan.zhihu.com/p/1899112824342577371&#xff0c;簡單明了 prefix Tunning改變了什么呢&#xff…

FlashAttention 深入淺出

一 標準Attention的計算 1.1 標準Attention機制詳解 標準Attention&#xff08;注意力&#xff09;機制是深度學習&#xff0c;尤其是在自然語言處理領域中一項革命性的技術&#xff0c;它允許模型在處理序列數據時&#xff0c;動態地將焦點放在輸入序列的不同部分&#xff0c;…

C/C++ inline-hook(x86)高級函數內聯鉤子

&#x1f9f5; C/C inline-hook&#xff08;x86&#xff09;高級函數內聯鉤子 引用&#xff1a; fetch-x86-64-asm-il-sizeC i386/AMD64平臺匯編指令對齊長度獲取實現 &#x1f9e0; 一、Inline Hook技術體系架構 Inline Hook是一種二進制指令劫持技術&#xff0c;通過修改目…

云服務器的安全防護指南:從基礎安全設置到高級威脅防御

隨著云計算的廣泛應用&#xff0c;云服務器已成為企業和個人存儲數據、運行應用的重要基礎設施。然而&#xff0c;隨之而來的安全威脅也日益增多——從常見的網絡攻擊&#xff08;如 DDoS、SQL 注入&#xff09;到復雜的惡意軟件和零日漏洞&#xff0c;無一不考驗著系統的安全性…

狀態機管家:MeScroll 的交互秩序維護

一、核心架構設計與性能基石 MeScroll作為高性能滾動解決方案&#xff0c;其架構設計遵循"分層解耦、精準控制、多端適配"的原則&#xff0c;通過四大核心模塊實現流暢的滾動體驗&#xff1a; 事件控制層&#xff1a;精準捕獲觸摸行為&#xff0c;區分滾動方向與距…

數據出海的隱形冰山:企業如何避開跨境傳輸的“合規漩渦”?

首席數據官高鵬律師數字經濟團隊創作&#xff0c;AI輔助凌晨三點的寫字樓&#xff0c;某跨境電商的技術總監盯著屏幕上的報錯提示&#xff0c;指尖懸在鍵盤上遲遲沒落下。剛從新加坡服務器調取的用戶行為數據&#xff0c;在傳輸到國內分析系統時被攔截了——系統提示“不符合跨…