React 中hooks之useTransition使用总结
目录
- 概述
- 基本用法
- 使用场景
- 最佳实践
- 注意事项
概述
什么是 useTransition?
useTransition 是 React 18 引入的新 Hook,用于标记非紧急的状态更新。它允许组件在状态转换期间保持响应,通过将某些更新标记为"过渡"来推迟它们的渲染。
主要特点
- 保持 UI 响应性
- 区分紧急和非紧急更新
- 提供加载状态指示器
- 不会阻塞用户交互
基本用法
1. 基本语法
import { useTransition } from 'react';function MyComponent() {const [isPending, startTransition] = useTransition();const [count, setCount] = useState(0);const handleClick = () => {startTransition(() => {setCount(c => c + 1); // 这个更新被标记为过渡,当某次更新造成页面阻塞时,用户点击其他组件操作,此时会降低此次更新的优先级,不阻塞页面渲染先更新优先级高的操作,startTransition中只能写同步的代码,异步代码会打断低优先级,比如不能使用setTimeout});};return (<div>{isPending && <Spinner />}<button onClick={handleClick}>Increment</button><p>Count: {count}</p></div>);
}//isPending为true是表示当前渲染阻塞避免页面出现卡顿现象先显示loading状态组件,直到isPending为false时将展示渲染好的组件
2. 带加载状态的示例
function SearchResults() {const [query, setQuery] = useState('');const [results, setResults] = useState([]);const [isPending, startTransition] = useTransition();const handleSearch = (e: React.ChangeEvent<HTMLInputElement>) => {// 立即更新输入值(紧急更新)setQuery(e.target.value);// 将搜索结果更新标记为过渡(非紧急更新)startTransition(() => {// 模拟搜索操作const searchResults = performSearch(e.target.value);setResults(searchResults);});};return (<div><input value={query} onChange={handleSearch} />{isPending ? (<div>Loading...</div>) : (<ul>{results.map(result => (<li key={result.id}>{result.title}</li>))}</ul>)}</div>);
}
使用场景
1. 大量数据渲染
function DataGrid() {const [data, setData] = useState([]);const [isPending, startTransition] = useTransition();const [filter, setFilter] = useState('');const handleFilterChange = (newFilter: string) => {setFilter(newFilter); // 立即更新过滤条件startTransition(() => {// 延迟大量数据的过滤和渲染const filteredData = processLargeDataSet(newFilter);setData(filteredData);});};return (<div><input value={filter} onChange={e => handleFilterChange(e.target.value)} />{isPending ? (<LoadingGrid />) : (<VirtualizedGrid data={data} />)}</div>);
}
2. 路由切换
function App() {const [isPending, startTransition] = useTransition();const [currentPage, setCurrentPage] = useState('home');const navigate = (page: string) => {// 立即更新导航状态startTransition(() => {setCurrentPage(page);});};return (<div><Navigation onNavigate={navigate} />{isPending ? (<PageTransitionSpinner />) : (<Page name={currentPage} />)}</div>);
}
3. 表单验证
function ComplexForm() {const [formData, setFormData] = useState({});const [errors, setErrors] = useState({});const [isPending, startTransition] = useTransition();const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {const { name, value } = e.target;// 立即更新表单值setFormData(prev => ({...prev,[name]: value}));// 将复杂的验证逻辑标记为过渡startTransition(() => {const validationErrors = validateFormField(name, value);setErrors(prev => ({...prev,[name]: validationErrors}));});};return (<form><input name="email" onChange={handleChange} value={formData.email || ''} />{isPending ? (<ValidatingIndicator />) : (errors.email && <ErrorMessage error={errors.email} />)}</form>);
}
最佳实践
- 区分更新优先级
function UserProfile() {const [isPending, startTransition] = useTransition();const handleInput = (e: React.ChangeEvent<HTMLInputElement>) => {// 高优先级:直接更新输入值setInputValue(e.target.value);// 低优先级:更新预览startTransition(() => {setPreviewData(generatePreview(e.target.value));});};
}
- 合理使用 isPending
function LoadingStates() {const [isPending, startTransition] = useTransition();return (<div>{/* 使用骨架屏而不是简单的加载指示器 */}{isPending ? (<Skeleton />) : (<Content />)}</div>);
}
注意事项
- 不要在 transition 中包含紧急更新
// ❌ 错误示例
startTransition(() => {setInputValue(e.target.value); // 这应该是紧急更新
});// ✅ 正确示例
setInputValue(e.target.value); // 紧急更新
startTransition(() => {setSearchResults(search(e.target.value)); // 非紧急更新
});
- 避免不必要的 transition
// ❌ 不需要 transition
startTransition(() => {setCount(count + 1); // 简单的状态更新不需要 transition
});// ✅ 适合使用 transition
startTransition(() => {setFilteredItems(items.filter(complexFilter)); // 复杂计算
});
总结
-
useTransition 适用场景:
- 大量数据处理
- 复杂 UI 更新
- 后台计算
- 非阻塞渲染
-
主要优势:
- 提升用户体验
- 保持 UI 响应性
- 优化渲染性能
- 提供加载状态
-
使用建议:
- 合理区分更新优先级
- 适当处理加载状态
- 避免过度使用
- 配合其他性能优化手段
相关文章:
React 中hooks之useTransition使用总结
目录 概述基本用法使用场景最佳实践注意事项 概述 什么是 useTransition? useTransition 是 React 18 引入的新 Hook,用于标记非紧急的状态更新。它允许组件在状态转换期间保持响应,通过将某些更新标记为"过渡"来推迟它们的渲染。 主要特…...
怎样使用树莓派自己搭建一套ADS-B信号接收系统
0 我们知道,ADS-B全称广播式自动相关监视系统,其实就是飞机发出的广播信号,用明码来对外发送自己的位置、高度、速度、航向等信息,是公开信息。连续接收到一架飞机发出的ADS-B信息后,可以通过其坐标点来描绘出飞机的航…...
Chrome谷歌浏览器如何能恢复到之前的旧版本
升级了谷歌最新版不习惯,如何降级版本 未完待续。。 电脑中的Chrome谷歌浏览器升级到了最新版本,但是有种种的不适应,如何能恢复到之前的旧版本呢?我们来看看操作步骤,而且无需卸载重装。 怎么恢复Chrome 之前版本&a…...
路由器旁挂三层网络实现SDWAN互联(爱快SD-WAN)
近期因公司新办公区建设,原有的爱快路由器的SDWAN功能实现分支之间互联的服务还需要继续使用。在原有的小型网络中,使用的爱快路由器当作网关设备,所以使用较为简单,如下图所示。 现变更网络拓扑为三层网络架构,但原有的SDWAN分支…...
代码随想录算法训练营第五十五天 |108.冗余连接 109.冗余连接Ⅱ
108.冗余连接: 文章链接 题目链接:108.冗余连接 思路 首先分析题目,给定拥有n个节点和n条边的图,其中图是在原n个节点和n - 1条无环无向图中添加一条边得到的。要求是输出多出的边。(PS:可能会有多个答案…...
Unity补充 -- 协程相关
1.协程。 协程并不是线程。线程是主线程之外的另一条 代码按照逻辑执行通道。协程则是在代码在按照逻辑执行的同时,是否需要执行额外的语句块。 2.协程的作用。 在update执行的时候,是按照帧来进行刷新的,也是按照帧执行代码的。但是又不想…...
【第二十周】U-Net:用于生物图像分割的卷积神经网络
文章目录 摘要Abstract文章信息研究动机U-Net网络结构U-Net网络搭建数据增强损失函数转置卷积创新性与不足创新性:不足: 总结 摘要 U-Net(Convolutional Networks for Biomedical Image Segmentation)是一种用于图像分割的深度学…...
部署Metricbeat监测ES
官方参考文档 安装Metricbeat curl -L -O https://artifacts.elastic.co/downloads/beats/metricbeat/metricbeat-7.17.27-linux-x86_64.tar.gztar xzvf metricbeat-7.17.27-linux-x86_64.tar.gz设置 Metricbeat连接到 Elasticsearch 进入metricbeat目录配置metricbeat.yml …...
Pytorch|YOLO
🍨 本文为🔗365天深度学习训练营中的学习记录博客🍖 原作者:K同学啊 一、 前期准备 1. 设置GPU 如果设备上支持GPU就使用GPU,否则使用CPU import torch import torch.nn as nn import torchvision.transforms as transforms im…...
云计算与物联网技术的融合应用(在工业、农业、家居、医疗、环境、城市等整理较全)
摘要 为生产领域带来更加全面和深入的变革。通过云计算平台对物联网数据进行处理和分析,企业可以实现对生产过程的更加精细化的管理和控制。 1. 智能生产调度 通过云计算和物联网技术的融合应用,企业可以实现对生产线上各个环节的实时监控和数据分析。…...
基于python+Django+mysql鲜花水果销售商城网站系统设计与实现
博主介绍:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育、辅导。 所有项目都配有从入门到精通的基础知识视频课程ÿ…...
Golang:报错no required module provides package github.com/xx的解决方法
报错 问题重现可能的原因及解决方法1. 未初始化 Go 模块解决方法: 2. 没有添加依赖解决方法: 3. 网络问题解决方法: 4. 依赖版本问题解决方法: 5. 包未发布或路径拼写错误解决方法: 6. go mod tidy 未运行解决方法&…...
数据结构与算法(2):顺序表与链表
1.前言 哈喽大家好喔,今天博主继续进行数据结构的分享与学习,今天的主要内容是顺序表与链表,是最简单但又相当重要的数据结构,为以后的学习有重要的铺垫,希望大家一起交流学习,互相进步,让我们…...
华为OD机试E卷 --过滤组合字符串--24年OD统一考试(Java JS Python C C++)
文章目录 题目描述输入描述输出描述用例题目解析JS算法源码Java算法源码python算法源码c算法源码c++算法源码题目描述 数字 0、1、2、3、4、5、6、7、8、9 分别关联 a~z 26 个英文字母。 0 关联“a”"b”"c1 关联“d”"e”"f2 关联“g"“h”“i”3 关…...
QT跨平台应用程序开发框架(3)—— 信号和槽
目录 一,基本概念 二,connect函数使用 2.1 connect 2.2 Qt内置信号和槽 2.3 一些细节 三,自定义信号和槽 3.1 自定义槽函数 3.2 自定义信号 3.3 带参数的信号槽 四,信号和槽的意义 五,信号和槽断开连接 六&…...
从 0 开始实现一个 SpringBoot + Vue 项目
从 0 开始实现一个 SpringBoot Vue 项目 从 0 开始实现一个 SpringBoot Vue 项目 软件和工具创建 SpringBoot 后端项目创建 MySQL 数据库配置文件实现增删改查接口 Model 层mapper 层service 层controller 层测试 实现项目功能接口 代码测试 创建 Vue 前端 安装 Node.js配置…...
【无标题】微调是迁移学习吗?
是的,微调(Fine-Tuning)可以被视为一种迁移学习(Transfer Learning)的形式。迁移学习是一种机器学习方法,其核心思想是利用在一个任务上学到的知识来改进另一个相关任务的性能。微调正是通过在预训练模型的…...
虚幻基础1:hello world
能帮到你的话,就给个赞吧 😘 文章目录 hello world创建项目创建关卡创建蓝图将蓝图插入关卡中运行 hello world 本文引擎为5.5.1 创建项目 如图 创建后如图。 创建关卡 如图 创建蓝图 如图 选择actor 双击进入蓝图节点 选择事件图表 创…...
C链表的一些基础知识
一、链表的基本概念 链表是一种常见的线性数据结构,它由一系列节点组成,每个节点包含数据部分和指向下一个节点的指针(单链表情况)。通过指针将各个节点连接起来,与数组不同,链表在内存中的存储不是连续的…...
JDK长期支持版本(LTS)
https://blogs.oracle.com/java/post/the-arrival-of-java-23 jdk长期支持版本(LTS):JDK 8、11、17、21:...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...
