0Pricing
React Academy · 课时

防抖与节流为何对界面很重要

了解未节流的按键、滚动和调整大小处理器带来的性能开销,以及两种方案分别适用的时机

防抖与节流为何对界面很重要 是 CoddyKit 上的免费 React Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 React Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 React Academy 课程共包含 4 节课。

高频用户事件

某些 DOM 事件的触发频率极高。keypress 事件会在每次按键时触发。用户滚动时,scroll 事件每秒会触发几十次。用户拖动窗口边框时,resize 事件会持续触发。逐一处理每个事件可能会让浏览器和服务器不堪重负。

不受限制的处理函数的代价

如果按键处理函数在每次按键时都发起接口请求,用户输入“React 钩子”(11 个字符)会触发 11 次网络请求,其中大多数对应不完整的查询。同样,在每个滚动像素上更新视差动画,会使每秒重新渲染数百次。这会浪费 CPU、网络资源和电量。

防抖的作用

防抖会延迟执行,直到事件停止触发一段指定时间。如果用户仍在输入,计时器会在每次按键时重置。只有在静默 N 毫秒后,处理函数才最终执行一次。防抖解决的是这样的问题:“用户完成某项操作后再执行此操作。”

节流的作用

节流会将执行频率限制为每个时间间隔最多一次,无论触发了多少个事件。如果用户快速滚动,100 毫秒的节流会确保处理函数每秒最多运行 10 次。节流解决的是这样的问题:“定期执行,但不要比每 N 毫秒一次更频繁。”

何时使用防抖

当您只关心用户停止操作后的最终值时,防抖是正确的选择。典型场景包括:搜索输入框(输入暂停后发送接口请求)、窗口大小调整处理函数(调整结束后重新计算布局),以及会检查服务器的表单字段验证(等待完整输入后再验证)。

何时使用节流

当您希望在持续活动期间定期更新时,节流是正确的选择。典型场景包括:滚动位置处理函数(以最多 30 帧/秒的频率更新阅读进度条或固定标题)、鼠标移动跟踪(记录光标位置用于分析),以及拖动事件处理函数(平滑地更新可拖动元素的位置,同时避免事件过多)。

简单实现存在陷阱

如果没有充分理解其机制就自行编写防抖或节流,可能会产生遗漏最后一个事件(后沿)、在错误的边沿触发,或未在组件卸载时清理计时器等问题。通常最好使用成熟库中的经过充分验证的实现,因为它们能够正确处理所有边界情况。

lodash.debounce 和 lodash.throttle

该库提供 _.debounce(fn, wait) 和 _.throttle(fn, wait),并可通过选项控制首次触发和末次触发的行为。返回的函数具有 .cancel() 方法,可中止待处理的调用;还具有 .flush() 方法,可立即执行该调用。在 React 中,应将这些函数包装在 useRef 中,以避免重新渲染时重复创建。

性能预算

即使未使用节流的滚动处理函数每秒额外造成 50 次重新渲染,也可能消耗大量 CPU,尤其是在低端移动设备上。16 毫秒的帧预算(60 帧/秒)意味着每次重新渲染都必须在 16 毫秒内完成,以避免丢帧。防抖和节流是解决帧率问题的第一道防线。

事件处理函数与状态更新

并非所有高频处理函数都需要防抖。如果事件处理函数只是读取值,而不更新状态或调用接口——例如,在引用中记录最后一次鼠标位置——就不需要防抖。只有会触发高成本操作的处理函数才需要防抖或节流,例如状态更新、接口调用或 DOM 测量。

取消防抖函数

组件卸载时,应取消任何待处理的防抖调用,以防止在卸载后更新状态。如果使用 useRef 存储防抖函数,请在 useEffect 的清理函数中调用 debouncedFn.cancel()。防抖函数提供此方法正是为了这一用途。

防抖与节流的使用

如果要在用户停止在搜索框中输入时触发接口调用,应使用哪种技术?

课程回顾:防抖与节流

如果按键、滚动和调整大小等高频事件的处理函数在每次事件发生时都运行,就可能造成性能问题。防抖会等待静默期,最适合搜索输入和窗口大小调整处理函数。节流会限制触发频率,最适合滚动和拖动。请使用存储在引用中的成熟库实现,并始终在组件卸载时取消调用。

常见问题解答

「防抖与节流为何对界面很重要」课时是免费的吗?

是的 — 「防抖与节流为何对界面很重要」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 React Academy 课程的其余内容,请升级到 CoddyKit PRO。 React Academy 课程共包含 4 节课。

「防抖与节流为何对界面很重要」这节课中我会学到什么?

了解未节流的按键、滚动和调整大小处理器带来的性能开销,以及两种方案分别适用的时机 你通过在浏览器中直接运行的动手代码来练习 React Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 React Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 React Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「防抖与节流为何对界面很重要」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 React Academy 课中编写并运行代码吗?

能。每节 React Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 防抖与节流为何对界面很重要
  2. 实现 useDebounce 自定义钩子
  3. 实现 useThrottle 自定义钩子
  4. 实际应用:搜索、滚动和调整大小
← 返回 React Academy