news 2026/9/3 0:13: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/9/2 23:25:04

强烈安利8个AI论文工具:研究生毕业论文写作必备测评与推荐

在当前学术研究日益数字化的背景下&#xff0c;研究生群体在论文写作过程中面临诸多挑战&#xff1a;从文献检索、大纲构建到内容撰写、格式规范&#xff0c;每一个环节都可能成为效率瓶颈。尤其是在AI技术快速发展的今天&#xff0c;如何选择一款真正契合自身需求的AI写作工具…

作者头像 李华
网站建设 2026/9/2 21:33:32

2026冲刺用!9个AI论文平台深度测评,研究生毕业论文写作必备工具推荐

随着人工智能技术的不断进步&#xff0c;学术写作工具正逐步成为研究生群体不可或缺的得力助手。2026年&#xff0c;面对日益繁重的论文写作任务和严格的格式要求&#xff0c;如何高效、高质量地完成毕业论文&#xff0c;成为众多研究生关注的核心问题。为了帮助大家在激烈的学…

作者头像 李华
网站建设 2026/9/2 20:40:58

【YOLOv8多模态创新改进】全网独家复现创新 | TGRS 2025 | 引入MROD -YOLO的 MJRNet 多模态联合表征网络模块,对可见光与红外信息的早期深度融合、充分发挥多模态互补优势

一、本文介绍 🔥本文给大家介绍使用 MJRNet 多模态联合表征网络模块改进 YOLOv8 多模态目标检测模型,其核心作用是在网络前端实现高质量的多模态联合表征学习,通过对可见光与红外信息的早期深度融合,为后续检测提供信息充分且对齐良好的输入特征。MJRNet 利用全局上下文注…

作者头像 李华
网站建设 2026/9/2 20:41:32

《遗忘之海》:网易Joker工作室的“海洋实验”——当抽象遇上理性!

网易游戏近年的研发阵线向来以“高预算、高产量”著称&#xff0c;然而近期在杭州举办的《遗忘之海》线下闭门交流会&#xff0c;却让人看到了这家大厂内部一支研发团队的另类审美与胆识。这款游戏不仅仅是一款新产品&#xff0c;更像是一场关于游戏本质的公开实验。 ‍“海洋…

作者头像 李华
网站建设 2026/9/2 14:42:55

[前后端分离]springboot+vue的基于hive安顺旅游景点数据分析系统(368)(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

[前后端分离]springbootvue的基于hive安顺旅游景点数据分析系统(368)(设计源文件万字报告讲解)&#xff08;支持资料、图片参考_相关定制&#xff09;_文章底部可以扫码内容包含:源码数据库部署教程演示视频 开发工具:idea 数据库:mysql 开发系统:Windows10 架构模式&#xff1…

作者头像 李华