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 …