news 2026/4/18 11:02:24

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/4/18 1:57:02

服务器病毒处理记录

文章目录 发现的问题处理过程处理结果安全建议 从最新的top命令输出看到系统CPU使用率又回到99.9%&#xff0c;说明恶意进程又重新启动了。需要制定一个更彻底的计划来删除所有恶意文件并拔除根源。 toolName: todo_write status: success Todos updated: 6 items 开始分析最…

作者头像 李华
网站建设 2026/4/18 8:39:51

学术研究的智能导航者,让文献综述高效专业

在学术研究的征途上&#xff0c;文献综述既是研究的起点&#xff0c;也是学术能力的试金石。面对浩如烟海的学术资源&#xff0c;研究者常陷入"检索无门、筛选无方、梳理无序"的困境&#xff1a;如何从数万篇文献中精准定位核心资料&#xff1f;怎样梳理国内外研究脉…

作者头像 李华
网站建设 2026/4/18 3:49:02

基于STM32的温控风扇(有完整资料)

资料查找方式&#xff1a; 特纳斯电子&#xff08;电子校园网&#xff09;&#xff1a;搜索下面编号即可 编号&#xff1a; CJ-32-2022-006 设计简介&#xff1a; 本设计是基于STM32的温控风扇&#xff0c;主要实现以下功能&#xff1a; 温度控制风速&#xff0c;四个挡位&…

作者头像 李华
网站建设 2026/4/18 8:55:24

2026年新手小白部署Openclaw(clawdbot)AI助手保姆级步骤教程

2026年新手小白部署Openclaw&#xff08;clawdbot&#xff09;AI助手保姆级步骤教程&#xff01;OpenClaw&#xff08;Clawdbot&#xff09;是什么&#xff1f;OpenClaw&#xff08;原Clawdbot/Moltbot&#xff09;是一个开源的AI智能体平台&#xff0c;凭借其强大的任务自动化…

作者头像 李华
网站建设 2026/4/18 3:57:59

开源编程模型NousCoder-14B技术解析与未来挑战

开源编程模型NousCoder-14B技术解析与未来挑战 开源人工智能初创公司Nous Research于本周一发布了一款新的竞争性编程模型。据称&#xff0c;该模型仅使用48个某中心最新B200图形处理器&#xff0c;在四天内完成训练&#xff0c;其性能可匹敌或超越多个更大的专有系统。 该模…

作者头像 李华