当前位置: 首页 > news >正文

React中startTransition的使用

// 引入 React 的 Hook API:useState 管理状态、useTransition 处理非紧急更新、useMemo 缓存计算结果
import { useState, useTransition, useMemo } from 'react';/*** List 组件:* 根据输入的 query 动态渲染一个包含 10000 条数据的列表*/
function List({ query }) {// 固定字符串,用于展示匹配内容const word = 'hello word';// 使用 useMemo 缓存生成的列表项,避免重复创建大量 DOM 节点,提升性能const items = useMemo(() => {const arr = [];if (query.trim() === '') {// 如果 query 为空,则显示默认的 10000 个 "hello word"for (let i = 0; i < 10000; i++) {arr.push(<li key={i}>hello word</li>);}} else if (word.includes(query)) {// 如果 query 包含在 word 中,则拆分并高亮显示匹配内容const splitArr = word.split(query);for (let i = 0; i < 10000; i++) {arr.push(<li key={i}>{/* 高亮显示 query 内容 */}{splitArr[0]}<span style={{ color: 'red' }}>{query}</span>{splitArr[1]}</li>);}}return arr;}, [query]); // 只有当 query 改变时才重新计算// 渲染无序列表return <ul>{items}</ul>;
}/*** App 主组件:* 控制输入框与列表之间的交互逻辑*/
function App() {// search:控制输入框内容(立即更新)const [search, setSearch] = useState('');// query:控制 List 显示的内容(可延迟更新)const [query, setQuery] = useState('');// isPending:表示当前是否处于过渡状态(即非紧急更新中)const [isPending, startTransition] = useTransition();/*** 输入框变化事件处理函数* - 立即更新 search(保持 UI 响应)* - 使用 startTransition 延迟更新 query(优化性能)*/const handleChange = (e) => {const value = e.target.value;setSearch(value); // 紧急更新,确保输入框即时响应startTransition(() => {setQuery(value); // 非紧急更新,React 会优先处理用户可见的变化});};return (<>hello App{/* 输入框,绑定 value 和 onChange 事件 */}<input type="text" value={search} onChange={handleChange} />{/* 过渡期间显示加载提示 */}{isPending ? <p>加载中...</p> : null}{/* 将 query 传递给 List 组件进行内容渲染 */}<List query={query} /></>);
}// 导出 App 组件供其他模块使用
export default App;

📌 注释说明总结:

模块作用
useState管理组件内部状态
useTransition实现非紧急状态更新,提升用户体验流畅度
useMemo缓存复杂计算结果,避免重复渲染造成的性能浪费
List 组件展示大量数据,并支持关键词高亮
App 组件控制输入框与数据展示的交互逻辑
http://www.dtcms.com/a/196652.html

相关文章:

  • 数值分析填空题速通
  • HMDB51数据集划分
  • 深入解析:java.sql.SQLException: No operations allowed after statement closed 报错
  • Halcon算子应用和技巧14
  • 物联网赋能7×24H无人值守共享自习室系统设计与实践!
  • Elasticsearch 查询与过滤(Query vs. Filter)面试题
  • 怎么在excel单元格1-5行中在原来内容前面加上固定一个字?
  • STM32 | 软件定时器
  • 告别“知识孤岛”:RAG赋能网络安全运营
  • 线程(二)OpenJDK 17 中线程启动的完整流程用C++ 源码详解之主-子线程通信机制
  • 南航无人机大规模户外环境视觉导航框架!SM-CERL:基于语义地图与认知逃逸强化学习的无人机户外视觉导航
  • 【AI】SpringAI 第二弹:基于多模型实现流式输出
  • STM32+ESP8266连接onenet新平台
  • cursor/vscode启动项目connect ETIMEDOUT 127.0.0.1:xx
  • JavaScript防抖与节流全解析
  • 多平台屏幕江湖生存指南
  • 专题四:综合练习(组合问题的决策树与回溯算法)
  • 编译原理7~9
  • 数据库实验报告 数据定义操作 3
  • Oracle 高水位线(High Water Mark, HWM)
  • 【数据结构】线性表--队列
  • Echart地图数据源获取
  • [前端高频]数组转树、数组扁平化、深拷贝、JSON.stringifyJSON.parse等手撕
  • 微波至X射线波段详解2025.5.17
  • EXO 可以将 Mac M4 和 Mac Air 连接起来,并通过 Ollama 运行 DeepSeek 模型
  • 从零开始:使用 PyTorch 构建深度学习网络
  • 线性dp练习(碱基配对)
  • 计算机视觉与深度学习 | Python实现EMD-VMD-LSTM时间序列预测(完整源码和数据)
  • 系统架构设计(十):结构化编程
  • 【嵌入式DIY实例-Arduino篇】-OLED实现乒乓游戏