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

学习React-11-useDeferredValue

useDeferredValue

useDeferredValue 是 React 18 引入的一个 Hook,用于延迟更新某些非关键渲染内容,以提升性能。它通过将低优先级的更新推迟到高优先级任务完成后执行,避免主线程阻塞,尤其适用于输入框联想搜索等场景。

核心功能
  • 延迟渲染:接收一个状态值,返回一个延迟版本的值。React 会在高优先级更新完成后,再处理该值的更新。
  • 优先级调度:与并发模式(Concurrent Mode)协同工作,确保用户交互(如输入)的流畅性。
基本用法
  // query:实时响应用户输入的状态// deferredQuery:延迟更新的值,传递给耗时的子组件(如搜索结果列表)const deferredQuery = useDeferredValue(query);
适用场景

✅ 输入联想搜索:输入框内容实时更新,但搜索结果可稍后渲染。
✅ 大数据列表渲染:避免列表渲染阻塞用户交互。
✅ 非关键UI更新:如次要图表、统计数据的延迟加载。

useTransition 和 useDeferredValue 的区别

useTransition 是“我推迟我发起的更新”, useDeferredValue 是“我推迟别人传给我的值”

维度useTransitionuseDeferredValue
控制对象状态更新函数(setState)某个具体值(props / state)
触发主体当前组件主动发起更新父组件传值,当前组件被动“延缓”
返回值[isPending, startTransition]deferredValue
典型场景路由切换、筛选项、搜索按钮点击实时搜索输入框、高频变化的列表渲染
是否产生加载状态有 isPending 布尔值无内置加载状态,需自己对比 value !== deferredValue
是否可取消/跳过高优先级更新可中断低优先级同左(都是 concurrent render)

简单来说:

  • 需要点按钮选筛选项切路由 → 用 useTransition
  • 需要输入框实时反映列表慢点渲染 → 用 useDeferredValue
小栗子-延迟搜索数据的更新
import React, { useState, useTransition, useDeferredValue } from 'react'
import { Input, List } from 'antd'
import mockjs from 'mockjs'// 定义列表项数据类型
interface ResultType {name: number    // 名称address: string // 地址
}export function UseTransition() {const [val, setVal] = useState('')const [list] = useState<ResultType[]>(() => {return mockjs.mock({'list|10000': [{name: '@natural',address: '@county(true)'}]}).list})// val 时时状态, deferredQuery 延迟后的状态const deferredQuery = useDeferredValue(val)const isStale = deferredQuery !== val // 检查是否为延迟状态const findItem = () => {console.log(`${deferredQuery}---${val}`)return list.filter(item => item.name.toString().includes(deferredQuery))}return (<div><Input value={val} onChange={(e) => setVal(e.target.value)} /><List loading={isStale}  renderItem={(item) => <List.Item><List.Item.Meta title={item.name} description={item.address} /></List.Item>} dataSource={findItem()}></List></div>)
}

效果如下:请添加图片描述
注意: useDeferredValue 并不同于防抖机制,它并不能设置延时时间。useDeferredValue的延时时间是根据设备性能来的。


文章转载自:

http://54MP5Eum.mLnbd.cn
http://CZASzOIf.mLnbd.cn
http://JxHnsf7L.mLnbd.cn
http://45lCBOlr.mLnbd.cn
http://B7aISudg.mLnbd.cn
http://mB2oRiW4.mLnbd.cn
http://6mDk9coJ.mLnbd.cn
http://tIFEEYsc.mLnbd.cn
http://sJ48AWVK.mLnbd.cn
http://TKS3JBBi.mLnbd.cn
http://kWdz0HrX.mLnbd.cn
http://jeisIkEr.mLnbd.cn
http://bMmlqGlM.mLnbd.cn
http://Gj4BOj19.mLnbd.cn
http://QH4822td.mLnbd.cn
http://9oTw6mW2.mLnbd.cn
http://4K7NvYgN.mLnbd.cn
http://ZPfZ8O9n.mLnbd.cn
http://NDSU2Jrk.mLnbd.cn
http://H1eJmtMp.mLnbd.cn
http://WWoQVKjQ.mLnbd.cn
http://c5IrV5Je.mLnbd.cn
http://a6JHzSV7.mLnbd.cn
http://LKQ0H7ob.mLnbd.cn
http://GYcWUBbK.mLnbd.cn
http://PbXgq7ud.mLnbd.cn
http://oCkD1BXK.mLnbd.cn
http://I2dknC3J.mLnbd.cn
http://PIdQ28pN.mLnbd.cn
http://kLgAIVnl.mLnbd.cn
http://www.dtcms.com/a/376756.html

相关文章:

  • Django项目部署实战:Nginx + Gunicorn 云服务器完整指南
  • 【实战+原理】微软云 Azure Database 私有网络接入模式全解析:从子网委派到Private Endpoint
  • 排序---插入排序(Insertion Sort)
  • k8s的service
  • 量化冗余分析中变量的关系丨TomatoSCI分析日记
  • Python设计模式
  • AD8028ARZ-REEL7电子元器件ADI 运算放大器IC 精密模拟芯片
  • uniapp和vue3项目中引入echarts 、lime-echart(微信小程序、H5等)
  • SpringMVC 执行流程分析 详解(图解SpringMVC执行流程)
  • Pytest 常见问题及其解决方案
  • 9-10关于JS初学产生的问题
  • Gradle使用技巧(Android场景)
  • 【Kubernetes】常见面试题汇总(十三)
  • MySql 内外连接
  • 从Java全栈到前端框架的实战之路
  • AI电子宠物本地部署模型方案全面解析
  • 行业学习【电商】:垂直电商如何理解?以专业宠物平台为例
  • Android 项目:画图白板APP开发(五)——橡皮擦(全面)
  • 2018年下半年 系统架构设计师 综合知识
  • SPEA2多目标进化算法:理论与应用全解析
  • 医院高值耗材智能化管理路径分析(上)
  • Java 声明式编程- Stream API 实战
  • 9月10日
  • LeakCanary原理示例讲解
  • 多集群 Kubernetes 部署与混合云资源治理架构设计分享
  • 人工智能机器学习——模型评价及优化
  • IndexTTS2安装说明
  • Vue:事件处理机制详解
  • 【笔记】空气弹簧概述、刚度调节原理
  • IgH EtherCAT 主站核心技术解析:从架构到工业部署的底层逻辑