news 2026/5/14 6:47:47

react的hooks防抖和节流是怎样做的

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
react的hooks防抖和节流是怎样做的

一、先给面试官的“标准定义”(先声夺人)

防抖(debounce):在事件触发一段时间后才执行,期间再次触发会重新计时
节流(throttle):在固定时间内只执行一次

这一句一定要先说。


二、为什么在 React Hooks 里要“特别处理”?

问题本质:闭包 + 重新渲染

const fn = () => { console.log(count) }
  • 每次 render 都是新函数

  • 定时器 / 事件里用的可能是旧状态

👉普通 JS 防抖在 Hooks 里会失效或拿到旧值


三、Hooks 防抖(推荐实现)

1️⃣ 最稳方案:useRef + useCallback

function useDebounceFn(fn, delay = 300) { const timer = useRef<number | null>(null) const fnRef = useRef(fn) // 始终指向最新 fn,解决闭包问题 fnRef.current = fn const debounce = useCallback((...args) => { if (timer.current) { clearTimeout(timer.current) } timer.current = window.setTimeout(() => { fnRef.current(...args) }, delay) }, [delay]) return debounce }

使用方式

const onSearch = useDebounceFn(value => { fetchList(value) }, 500) <input onChange={e => onSearch(e.target.value)} />

2️⃣ 面试官加分点

使用 useRef 保存最新函数,避免闭包导致状态不更新。


四、Hooks 节流(两种方式都要会)


方案一:时间戳节流(最稳定)

function useThrottleFn(fn, delay = 300) { const lastTime = useRef(0) const fnRef = useRef(fn) fnRef.current = fn return useCallback((...args) => { const now = Date.now() if (now - lastTime.current >= delay) { lastTime.current = now fnRef.current(...args) } }, [delay]) }

方案二:定时器节流(常被追问)

function useThrottleFn(fn, delay = 300) { const timer = useRef<number | null>(null) const fnRef = useRef(fn) fnRef.current = fn return useCallback((...args) => { if (timer.current) return timer.current = window.setTimeout(() => { fnRef.current(...args) timer.current = null }, delay) }, [delay]) }

两种节流的区别(面试官爱问)

方式特点
时间戳立即执行
定时器延迟执行

五、为什么不用 lodash debounce?

可以用,但要说清楚限制

const debouncedFn = useMemo( () => debounce(fn, 300), [] )

❌ 问题:

  • fn 变了,debounce 不更新

  • 容易产生脏数据

正确用法

const fnRef = useRef(fn) fnRef.current = fn const debounced = useMemo( () => debounce((...args) => fnRef.current(...args), 300), [] )

六、Hooks 防抖节流常见坑(必背)

❌ 错误写法

const fn = debounce(() => { setCount(count + 1) }, 300)

问题

  • 每次 render 都创建新 debounce

  • count 永远是旧值


✅ 正确认知

  • 防抖节流函数要只创建一次

  • 执行的函数要始终是最新的


七、什么时候用防抖?什么时候用节流?

防抖(Debounce)

  • 搜索框

  • 输入联想

  • 表单校验

节流(Throttle)

  • 滚动

  • resize

  • 拖拽


八、面试终极总结(一定要背)

React Hooks 下实现防抖节流,关键不是 setTimeout,而是用 useRef 解决闭包问题,保证函数引用稳定且状态最新。


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/13 23:01:12

思路分享--肿瘤细胞异质性过高怎么办?

作者&#xff0c;Evil Genius 在老家躺平还是好啊&#xff0c;打了2天麻将&#xff0c;输了200多。 今天我们来分享思路&#xff0c;关于肿瘤细胞的异质性问题。 肿瘤样本的异质性很高&#xff0c;从基因组学来讲&#xff0c;每种癌症都有很多种亚型&#xff0c;我们以肺癌中…

作者头像 李华
网站建设 2026/5/12 3:53:14

基于YOLOv8的农业害虫智能识别系统(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

基于YOLOv8的农业害虫智能识别系统(设计源文件万字报告讲解)&#xff08;支持资料、图片参考_相关定制&#xff09;_文章底部可以扫码完整农业害虫智能识别系统&#xff0c;包含前后端完整代码和高质量数据集 核心功能&#xff1a; 害虫智能识别&#xff1a;单图/批量识别&…

作者头像 李华
网站建设 2026/5/12 5:03:53

【系统架构设计-综合题】计算机系统基础(1)

文章目录 题目1&#xff1a;操作系统并发执行与资源制约&#xff08;填空2、3、4&#xff09;题目描述答案与解析 题目2&#xff1a;嵌入式系统I/O中断方式&#xff08;填空5、6&#xff09;题目描述答案与解析 题目3&#xff1a;计算机系统软件层次划分题目描述答案与解析 题目…

作者头像 李华
网站建设 2026/5/12 5:03:53

百考通让论文创作轻松高效

在学术研究的征途上&#xff0c;论文写作既是成果的凝练&#xff0c;也是挑战的起点。从选题的迷茫、文献的浩瀚&#xff0c;到格式的繁琐、逻辑的严谨&#xff0c;无数研究者曾为这些环节耗费大量心力。当深夜面对空白文档的焦虑、导师反复修改的压力、截稿日期的倒计时步步紧…

作者头像 李华
网站建设 2026/5/12 5:03:48

计算机毕设java邯郸学院健康驿站管理系统 基于SpringBoot的高校健康隔离管理平台设计与实现 校园防疫健康服务系统开发与应用研究

计算机毕设java邯郸学院健康驿站管理系统8h5689&#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。 随着高校疫情防控常态化管理需求的日益凸显&#xff0c;传统的人工登记与健康监测…

作者头像 李华
网站建设 2026/5/14 6:19:39

计算机毕设Java基于Vue框架的烟酒销售管理系统 SpringBoot+Vue烟酒电商销售平台的设计与实现 基于Java Web的卷烟酒类商品在线销售系统开发

计算机毕设Java基于Vue框架的烟酒销售管理系统89bs39 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。随着互联网技术的快速发展和电子商务的日益普及&#xff0c;传统烟酒零售行…

作者头像 李华