React?Hooks使用startTransition與useTransition教程示例
引言
今天帶來的是react18版本推出的全新hooks:useTransition,它的使用范圍主要是用于性能優(yōu)化,今天我們一探究竟吧。
需求分析
假設(shè)現(xiàn)在有如下需求:當用戶在輸入框查詢數(shù)據(jù)時,需要實時根據(jù)用戶輸入數(shù)據(jù)進行搜索提示項的展示。與以往不同的是,提示列表的個數(shù)是十分龐大的,每次都在10000條以上。
設(shè)計過程
import {useState} from "react";
import styles from "./index.module.css";
const Home:React.FC = () => {
const [val,setVal] = useState('');
const [arr,setArr] = useState<number[]>([]);
//根據(jù)用戶輸入獲取查詢列表
const getList = (e:any) => {
setVal(e.target.value)
let arr = Array.from(new Array(10000),item=>Date.now())
setArr(arr);
}
return (
<div className={styles.box}>
<input value={val} onChange={getList}/>
{
arr.map((item,key)=>(
<div key={key}>{item}</div>
))
}
</div>
)
}
export default Home;
效果展示
我們快速在表單輸入了abcd,但是很明顯出現(xiàn)了卡頓現(xiàn)象,大約2s后表單和列表數(shù)據(jù)都被渲染。

現(xiàn)象分析
由于我們使用了useState對表單和列表的數(shù)據(jù)進行了更新,二者觸發(fā)批量更新機制但無優(yōu)先級差異。實際上為了保證用戶體驗感,我們需要保證輸入框的輸入數(shù)據(jù)永遠處于最新顯示,而列表的提示可以稍微滯后顯示。 基于優(yōu)先級渲染問題,react提出了startTransition方案。使用startTransition觸發(fā)的更新優(yōu)先級會被降低,從而優(yōu)雅降級,提高頁面刷新和渲染性能。
startTransition使用
在更新大數(shù)據(jù)更新或者大列表dom時,為了頁面性能和渲染優(yōu)化,我們可以對大數(shù)據(jù)或列表的更新過程采用startTransition優(yōu)雅降級處理。
使用
startTransition(()=>{
//大數(shù)據(jù)列表數(shù)據(jù)獲取
do...
})
例子改造
import {useState,startTransition} from "react";
import styles from "./index.module.css";
const Home:React.FC = () => {
const [val,setVal] = useState('');
const [arr,setArr] = useState<number[]>([]);
//根據(jù)用戶輸入獲取查詢列表
const getList = (e:any) => {
setVal(e.target.value)
let arr = Array.from(new Array(10000),item=>Date.now());
startTransition(()=>{
setArr(arr);
})
}
return (
<div className={styles.box}>
<input value={val} onChange={getList}/>
{
arr.map((item,key)=>(
<div key={key}>{item}</div>
))
}
</div>
)
}
export default Home;
效果展示

相對于上面未使用startTransition,此處的輸入框數(shù)據(jù)優(yōu)化了許多,并且大數(shù)據(jù)列表展示卡頓達到了一定程度優(yōu)化。
useTransition
useTransition和startTransition的功能一模一樣,只是通過hooks的展現(xiàn)方式出現(xiàn),并且增加了保存列表是否在渲染等待的狀態(tài)。
使用
第一個變量保存是否渲染中的狀態(tài),ture表示渲染等待中
第二個變量和startTransition的使用方式一模一樣
import {useState,startTransition} from "react";
const [pending,transition] = useTransition();
例子改造
import React,{useState,useTransition} from "react";
const Home:React.FC = () => {
const [val,setVal] = useState('');
const [arr,setArr] = useState<number[]>([]);
const [pending,transition] = useTransition()
const getList = (e:any) => {
setVal(e.target.value)
let arr = Array.from(new Array(10000),item=>Date.now())
transition(()=>{
setArr(arr);
})
}
return (
<div className={styles.box}>
<input value={val} onChange={getList}/>
{
pending?<h2>loading....</h2>:(
arr.map((item,key)=>(
<div key={key}>{item}</div>
))
)
}
</div>
)
}
export default Home;
效果展示
我們根據(jù)useTransition返回的pending狀態(tài)添加判斷,如果列表在渲染中就添加提示加載狀態(tài),否則正常顯示列表。

總結(jié)
在處理大批量數(shù)據(jù)渲染時,通過使用startTransition或useTransition可以很好的提升渲染性能,提高用戶體驗感。
以上就是React Hooks使用教程startTransition與useTransition的詳細內(nèi)容,更多關(guān)于React Hooks startTransition useTransition的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
react-router v4如何使用history控制路由跳轉(zhuǎn)詳解
這篇文章主要給大家介紹了關(guān)于react-router v4如何使用history控制路由跳轉(zhuǎn)的相關(guān)資料,文中通過示例代碼介紹的的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-01-01
在React中實現(xiàn)代碼熱重載(HMR)的操作步驟
在現(xiàn)代 React 開發(fā)中,代碼熱重載(HMR)是一項極大提升開發(fā)效率的技術(shù),它允許在不刷新整個頁面的情況下,實時更新模塊代碼,從而保留應(yīng)用狀態(tài),避免因頁面刷新導(dǎo)致的狀態(tài)丟失,本文將深入探討如何在 React 項目中實現(xiàn) HMR,包括其原理、配置步驟以及最佳實踐2025-05-05
詳解三種方式在React中解決綁定this的作用域問題并傳參
這篇文章主要介紹了詳解三種方式在React中解決綁定this的作用域問題并傳參,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
react 報錯Module build failed: Browserslis
這篇文章主要介紹了react 報錯Module build failed: BrowserslistError: Unknown browser query `dead`問題的解決方法,需要的朋友可以參考下2023-06-06

