React 中hooks之useDeferredValue用法总结

目录

  1. 概述
  2. 基本用法
  3. 与防抖节流的区别
  4. 使用场景
  5. 区分过时内容
  6. 最佳实践

概述

什么是 useDeferredValue?

useDeferredValue 是 React 18 引入的新 Hook,用于延迟更新某个不那么重要的部分。它接收一个值并返回该值的新副本,新副本会延迟更新。这种延迟是有益的,让紧急更新(如用户输入)优先于不紧急的更新(如渲染搜索结果列表)。

主要特点

  • 自动处理延迟
  • 与 Suspense 集成
  • 不会像防抖和useTransition那样丢弃中间值
  • 可以区分过时/最新内容

基本用法

1. 基本语法

import { useDeferredValue } from 'react';function SearchResults() {const [query, setQuery] = useState('');const deferredQuery = useDeferredValue(query);return (<div><input value={query} onChange={e => setQuery(e.target.value)} /><SlowList query={deferredQuery} /> {/* 使用延迟值进行渲染 */}</div>);
}

2. 区分过时内容示例

function SearchResults() {const [query, setQuery] = useState('');const deferredQuery = useDeferredValue(query);const isStale = query !== deferredQuery; // 判断内容是否过时return (<div><input value={query} onChange={e => setQuery(e.target.value)} /><div style={{ opacity: isStale ? 0.8 : 1,transition: 'opacity 0.2s ease'}}><SlowList query={deferredQuery} /></div>{isStale && <div>Loading new results...</div>}</div>);
}

与防抖节流的区别

1. 防抖 (Debounce)

// 防抖示例
function SearchWithDebounce() {const [query, setQuery] = useState('');const debouncedSearch = useCallback(debounce((value) => {// 执行搜索performSearch(value);}, 500),[]);// 会丢弃中间值,只处理最后一次输入return (<input onChange={e => {setQuery(e.target.value);debouncedSearch(e.target.value);}} />);
}

2. 节流 (Throttle)

// 节流示例
function SearchWithThrottle() {const [query, setQuery] = useState('');const throttledSearch = useCallback(throttle((value) => {performSearch(value);}, 100),[]);// 固定时间间隔执行,可能会延迟响应return (<input onChange={e => {setQuery(e.target.value);throttledSearch(e.target.value);}} />);
}

3. useDeferredValue

// useDeferredValue 示例
function SearchWithDeferred() {const [query, setQuery] = useState('');const deferredQuery = useDeferredValue(query);// React 会根据用户设备性能和当前 CPU 负载自动调整延迟// 不会丢弃任何值,而是以较低优先级处理它们return (<><input onChange={e => setQuery(e.target.value)} /><SlowList query={deferredQuery} /></>);
}

使用场景

1. 大列表渲染

function VirtualizedList({ items }) {const [filter, setFilter] = useState('');const deferredFilter = useDeferredValue(filter);const isStale = filter !== deferredFilter;const filteredItems = useMemo(() => items.filter(item => item.includes(deferredFilter)),[deferredFilter, items]);return (<div><input value={filter} onChange={e => setFilter(e.target.value)} /><div style={{ opacity: isStale ? 0.8 : 1 }}>{filteredItems.map(item => (<ListItem key={item} item={item} />))}</div></div>);
}

2. 实时预览

function MarkdownEditor() {const [text, setText] = useState('');const deferredText = useDeferredValue(text);const isStale = text !== deferredText;return (<div className="editor"><textareavalue={text}onChange={e => setText(e.target.value)}/><div className={`preview ${isStale ? 'stale' : ''}`}><MarkdownPreview text={deferredText} /></div></div>);
}

最佳实践

  1. 合理使用 useMemo
function SlowList({ text }) {const deferredText = useDeferredValue(text);const isStale = text !== deferredText;// 使用 useMemo 避免不必要的重新计算const items = useMemo(() => computeExpensiveList(deferredText),[deferredText]);return (<div style={{ opacity: isStale ? 0.8 : 1 }}>{items.map(item => (<ListItem key={item.id} item={item} />))}</div>);
}
  1. 优雅降级处理
function SearchResults({ query }) {const deferredQuery = useDeferredValue(query);const isStale = query !== deferredQuery;return (<div>{isStale && (<div className="stale-indicator">Showing results for "{deferredQuery}"<br />Updating results for "{query}"...</div>)}<ResultsList query={deferredQuery} /></div>);
}

总结

  1. useDeferredValue vs 防抖/节流:

    • useDeferredValue 不会丢弃更新
    • 自动适应用户设备性能
    • 与 React 并发特性集成
    • 提供过时状态标识
  2. 适用场景:

    • 大数据列表渲染
    • 实时预览功能
    • 复杂图表更新
    • 搜索建议
  3. 最佳实践:

    • 配合 useMemo 使用
    • 提供加载状态反馈
    • 合理处理过时内容
    • 注意性能优化
      在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/4531.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【博客之星2024年度总评选】年度回望:我的博客之路与星光熠熠

【个人主页】Francek Chen 【人生格言】征途漫漫&#xff0c;惟有奋斗&#xff01; 【热门专栏】大数据技术基础 | 数据仓库与数据挖掘 | Python机器学习 文章目录 前言一、个人成长与盘点&#xff08;一&#xff09;机缘与开端&#xff08;二&#xff09;收获与分享 二、年度创…

R 语言科研绘图第 20 期 --- 箱线图-配对

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…

支持向量机SVM的应用案例

支持向量机&#xff08;Support Vector Machine,SVM&#xff09;是一种强大的监督学习算法&#xff0c;广泛应用于分类和回归任务。 基本原理 SVM的主要目标是周到一个最优的超平面&#xff0c;该超平面能够将不同类别的数据点尽可能分开&#xff0c;并且使离该超平面最近的数…

Ubuntu 24.04 LTS 更改软件源

Ubuntu 24.04 LTS 修改软件源

wps数据分析000002

目录 一、快速定位技巧 二、快速选中技巧 全选 选中部分区域 选中部分区域&#xff08;升级版&#xff09; 三、快速移动技巧 四、快速录入技巧 五、总结 一、快速定位技巧 ctrl→&#xff08;上下左右&#xff09;快速定位光标对准单元格的上下部分双击名称单元格中…

[gdb调试] gdb调试基础实践gdb指令汇总

​ 一. 参考资料 《C/C代码调试的艺术》 二. 调试过程 1. 编译&#xff1a; 使用Debug模式编译&#xff0c;或者使用Release模式编译加入-g参数&#xff0c;-g选项会在可执行文件中加入调试信息&#xff0c;这些信息包含了程序中的变量名、函数名、行号等&#xff0c;能让…

风吹字符起,诗意Linux:一场指令与自由的浪漫邂逅(上)

文章目录 前言一. 知识过渡文件的属性与类型路径 二. 基本指令ls&#xff1a;风起草长&#xff0c;窥见世界的全貌cd&#xff1a;穿梭路径间&#xff0c;漫步荒原的远方pwd&#xff1a;定位自我&#xff0c;荒原上的坐标mkdir&#xff1a;种下希望&#xff0c;创建属于自己的世…

知识图谱中的word2vec 技术是做什么的?

Word2Vec 是一种将单词转换为向量表示的技术&#xff0c;由 Google 在 2013 年提出。这项技术的核心思想是通过大规模文本数据训练神经网络模型&#xff0c;从而将单词映射到低维稠密的向量空间中。这些向量能够捕捉到单词之间的语义和语法关系&#xff0c;使得相似或相关的单词…

Chrome 132 版本新特性

Chrome 132 版本新特性 一、Chrome 132 版本浏览器更新 1. 在 iOS 上使用 Google Lens 搜索 在 Chrome 132 版本中&#xff0c;开始在所有平台上推出这一功能。 1.1. 更新版本&#xff1a; Chrome 126 在 ChromeOS、Linux、Mac、Windows 上&#xff1a;在 1% 的稳定版用户…

Kafka 日志存储 — 日志索引

每个日志分段文件对应两个索引文件&#xff1a;偏移量索引文件用来建立消息偏移量到物理地址之间的映射&#xff1b;时间戳索引文件根据指定的时间戳来查找对应的偏移量信息。 1 日志索引 Kafka的索引文件以稀疏索引的方式构造消息的索引。它并不保证每个消息在索引文件中都有…

消息队列篇--原理篇--RocketMQ(NameServer,Broker,单机上每秒处理数百万条消息性能)

1、概述 RocketMQ是阿里巴巴开源的一个分布式消息中间件&#xff0c;具有高吞吐量、低延迟和强一致性等特点。它特别适合大规模分布式系统的消息传递&#xff0c;广泛应用于电商、金融、物流等领域的实时数据处理和异步通信。 RocketMQ是用Java语言实现&#xff0c;在设计时参…

简述mysql 主从复制原理及其工作过程,配置一主两从并验证。

MySQL 主从同步是一种数据库复制技术&#xff0c;它通过将主服务器上的数据更改复制到一个或多个从服务器&#xff0c;实现数据的自动同步。 主从同步的核心原理是将主服务器上的二进制日志复制到从服务器&#xff0c;并在从服务器上执行这些日志中的操作。 MySQL主从同步是基…

Web前端开发技术之HTMLCSS知识点总结

学习路线 一、新闻网界面1. 代码示例2. 效果展示3. 知识点总结3.1 HTML标签和字符实体3.2 超链接、颜色描述与标题元素3.3 关于图片和视频标签&#xff1a;3.4 CSS引入方式3.5 CSS选择器优先级 二、flex布局1. 代码示例2. 效果展示3. 知识点总结3.1 span标签和flex容器的区别3.…

内存故障原因与诊断(Reasons and Diagnosis of Memory Failure)

内存故障原因与诊断 您是否曾遇到过电脑无法启动、黑屏、死机&#xff0c;或者系统卡顿的情况&#xff1f;这些问题看起来很复杂&#xff0c;实际上大多数都是内存故障引起的。内存是电脑的核心组成部分之一&#xff0c;任何小东西问题都可能导致系统死机&#xff0c;严重时甚…

vulnhub靶机(ReconForce)

一.信息收集: 使用nmap进行端口扫描,发现其开放了ftp,http,ssh服务 nmap -sS -O -sV -p- 192.168.80.142访问其80端口发现是一个网页,点击TroubleShoot后发现其需要登录 在去尝试使用ftp的匿名登录发现无法执行任何命令,发现了他的欢迎语有点特别 在扫描目录后没有发现什么有…

54,【4】BUUCTF WEB GYCTF2020Ezsqli

进入靶场 吓我一跳&#xff0c;但凡放个彭于晏我都不说啥了 提交个1看看 1 and 11 1# 还尝试了很多&#xff0c;不过都被过滤了&#xff0c;头疼 看看别人的WP 竟然要写代码去跑&#xff01;&#xff01;&#xff01;&#xff0c;不会啊&#xff0c;先用别人的代码吧&#xf…

vue2使用flv.js在浏览器打开flv格式视频

组件地址&#xff1a;GitHub - bilibili/flv.js: HTML5 FLV Player flv.js 仅支持 H.264 和 AAC/MP3 编码的 FLV 文件。如果视频文件使用了其他编码格式就打不开。 flv.vue <template><div><el-dialog :visible.sync"innerVisibleFlv" :close-on-pre…

Git原理与应用(三)【远程操作 | 理解分布式 | 推送拉取远程仓库 | 标签管理】

Git 理解分布式版本控制系统远程仓库新建远程仓库克隆远程仓库向远程仓库推送配置Git忽略特殊文件 标签管理理解标签创建标签操作标签删除标签 理解分布式版本控制系统 我们⽬前所说的所有内容&#xff08;工作区&#xff0c;暂存区&#xff0c;版本库等等&#xff09;&#x…

网络安全:信息时代的守护者

随着互联网的快速发展&#xff0c;网络安全问题日益成为全球关注的焦点。无论是个人用户、企业组织还是政府部门&#xff0c;网络安全都已成为保障信息安全、保护隐私、确保社会秩序的基石。在这个数字化时代&#xff0c;如何应对复杂多变的网络安全威胁&#xff0c;成为了我们…

BUUCTF_Web([GYCTF2020]Ezsqli)

1.输入1 &#xff0c;正常回显。 2.输入1 &#xff0c;报错false&#xff0c;为字符型注入&#xff0c;单引号闭合。 原因&#xff1a; https://mp.csdn.net/mp_blog/creation/editor/145170456 3.尝试查询字段&#xff0c;回显位置&#xff0c;数据库&#xff0c;都是这个。…