news 2026/10/9 10:44:07

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/10/8 7:59:44

如何设置自定义Highcharts导出服务器?

设置自己的导出服务器 有时候你可能不想使用 Highcharts 的导出服务器&#xff0c;地址是 export.highcharts.com&#xff0c;比如你在运行一个安全性较高的网站&#xff0c;或者你不希望你的数据被传送到 Highcharts 的内容分发网络&#xff08;CDN&#xff09;中。 在搭建你…

作者头像 李华
网站建设 2026/10/8 9:18:52

2026别错过!10个降AI率软件降AIGC网站测评:自考论文降重必备神器

在2026年的自考论文写作中&#xff0c;AI生成内容&#xff08;AIGC&#xff09;的痕迹和查重率问题愈发成为考生们关注的焦点。随着教育机构对AI检测技术的不断升级&#xff0c;传统的论文撰写方式已难以满足当前的学术规范要求。因此&#xff0c;越来越多的学生开始寻求专业的…

作者头像 李华
网站建设 2026/10/8 7:33:07

基于32单片机的多功能电子语音时钟(有完整资料)

资料查找方式&#xff1a; 特纳斯电子&#xff08;电子校园网&#xff09;&#xff1a;搜索下面编号即可 编号&#xff1a; CJ-32-2022-009 设计简介&#xff1a; 本设计是32单片机的多功能电子语音时钟设计&#xff0c;主要实现以下功能&#xff1a; 1.通过OLED显示时间&a…

作者头像 李华
网站建设 2026/10/8 9:33:54

2026最新!风靡全网的降AI率网站 —— 千笔·降AI率助手

在AI技术席卷学术写作的今天&#xff0c;越来越多的学生、研究人员和职场人士选择借助AI辅助完成论文、报告和学术材料。然而&#xff0c;随之而来的“AI率超标”问题却成为横亘在学术道路上的隐形障碍——知网、维普、万方等主流查重系统纷纷升级算法&#xff0c;严打AI生成内…

作者头像 李华
网站建设 2026/10/8 6:06:37

网页端大文件上传插件如何支持视频文件的秒传和断点续传?

首先右键单击网站根目录,在弹出的快捷菜单中,选择"添加引用"菜单项,弹出"添加引用",切换到"浏览"找到组件的Dll文件"Bestcomy.Web.Controls.Upload.dll"(本文件可到官网下载,本文后面也提供下载),单击"确定",回到VS工作界面…

作者头像 李华
网站建设 2026/10/7 3:33:02

Flowise惊艳案例:100+模板复用后的定制化成果分享

Flowise惊艳案例&#xff1a;100模板复用后的定制化成果分享 1. 为什么Flowise能让人眼前一亮&#xff1f; 你有没有过这样的经历&#xff1a;花了一周时间研究LangChain文档&#xff0c;写了几十行代码&#xff0c;结果RAG问答还是答非所问&#xff1f;或者好不容易调通一个…

作者头像 李华