React?Hooks使用startTransition與useTransition教程示例
引言
今天帶來的是react18版本推出的全新hooks:useTransition,它的使用范圍主要是用于性能優(yōu)化,今天我們一探究竟吧。
需求分析
假設(shè)現(xiàn)在有如下需求:當(dāng)用戶在輸入框查詢數(shù)據(jù)時(shí),需要實(shí)時(shí)根據(jù)用戶輸入數(shù)據(jù)進(jìn)行搜索提示項(xiàng)的展示。與以往不同的是,提示列表的個(gè)數(shù)是十分龐大的,每次都在10000條以上。
設(shè)計(jì)過程
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ù)進(jìn)行了更新,二者觸發(fā)批量更新機(jī)制但無優(yōu)先級(jí)差異。實(shí)際上為了保證用戶體驗(yàn)感,我們需要保證輸入框的輸入數(shù)據(jù)永遠(yuǎn)處于最新顯示,而列表的提示可以稍微滯后顯示。 基于優(yōu)先級(jí)渲染問題,react提出了startTransition方案。使用startTransition觸發(fā)的更新優(yōu)先級(jí)會(huì)被降低,從而優(yōu)雅降級(jí),提高頁面刷新和渲染性能。
startTransition使用
在更新大數(shù)據(jù)更新或者大列表dom時(shí),為了頁面性能和渲染優(yōu)化,我們可以對大數(shù)據(jù)或列表的更新過程采用startTransition優(yōu)雅降級(jí)處理。
使用
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ù)列表展示卡頓達(dá)到了一定程度優(yōu)化。
useTransition
useTransition和startTransition的功能一模一樣,只是通過hooks的展現(xiàn)方式出現(xiàn),并且增加了保存列表是否在渲染等待的狀態(tài)。
使用
第一個(gè)變量保存是否渲染中的狀態(tài),ture表示渲染等待中
第二個(gè)變量和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ù)渲染時(shí),通過使用startTransition或useTransition可以很好的提升渲染性能,提高用戶體驗(yàn)感。
以上就是React Hooks使用教程startTransition與useTransition的詳細(xì)內(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)資料,文中通過示例代碼介紹的的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-01-01在React中實(shí)現(xiàn)代碼熱重載(HMR)的操作步驟
在現(xiàn)代 React 開發(fā)中,代碼熱重載(HMR)是一項(xiàng)極大提升開發(fā)效率的技術(shù),它允許在不刷新整個(gè)頁面的情況下,實(shí)時(shí)更新模塊代碼,從而保留應(yīng)用狀態(tài),避免因頁面刷新導(dǎo)致的狀態(tài)丟失,本文將深入探討如何在 React 項(xiàng)目中實(shí)現(xiàn) HMR,包括其原理、配置步驟以及最佳實(shí)踐2025-05-05詳解三種方式在React中解決綁定this的作用域問題并傳參
這篇文章主要介紹了詳解三種方式在React中解決綁定this的作用域問題并傳參,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08詳解react-router如何實(shí)現(xiàn)按需加載
本篇文章主要介紹了react-router如何實(shí)現(xiàn)按需加載,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-06-06react 報(bào)錯(cuò)Module build failed: Browserslis
這篇文章主要介紹了react 報(bào)錯(cuò)Module build failed: BrowserslistError: Unknown browser query `dead`問題的解決方法,需要的朋友可以參考下2023-06-06