0Pricing
React Academy · 课时

实际应用:搜索、滚动和调整大小

在真实组件示例中,将防抖应用于搜索输入,将节流应用于滚动和调整大小监听器。

实际应用:搜索、滚动和调整大小 是 CoddyKit 上的免费 React Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 React Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 React Academy 课程共包含 4 节课。

使用 useDebounce 实现实时搜索

在实时搜索组件中,请维护两个相互独立的状态变量:inputValue 用于保存原始输入(每次按键都会更新,从而保持输入框的响应性),debouncedQuery 则来自 useDebounce(inputValue, 300)(停止输入 300 毫秒后更新,并触发接口请求)。这种分离既能提供即时的视觉反馈,又能避免请求过于频繁。

搜索期间的加载状态

用户一开始输入就应显示加载旋转指示器,而不应等到接口请求开始时才显示。每当 inputValue !== debouncedQuery 时,都应将 isLoading: true,因为防抖等待期间二者尚未同步。查询稳定且获取完成后,再将其设为 false。这样,用户在整个过程中都能看到响应及时的加载指示器。

使用 useThrottle 处理滚动

视差效果或阅读进度条会根据滚动位置更新。请使用 16 毫秒的延迟,将滚动处理函数限制为最高每秒 60 帧:const throttledScrollY = useThrottle(scrollY, 16)。这样无需在滚动的每个像素变化时都重新计算位置,用户界面仍能平滑更新。

使用 useDebounce 处理窗口大小调整

监听窗口大小调整并重新计算布局时,最好使用防抖而不是节流。布局计算只需在用户完成调整后运行一次。请对窗口尺寸使用 200 毫秒的防抖。在拖动调整大小期间,用户界面可以显示简化状态;停止调整后再显示重新计算的布局。

将防抖与 AbortController 结合使用

当 debouncedQuery 发生变化时,请创建新的 AbortController,并将其 signal 传递给 fetch(url, { signal })。返回一个会调用 controller.abort() 的清理函数。当新的防抖查询到达时,这会取消先前查询仍在进行的请求,避免较慢的早期响应覆盖较快的后续响应所造成的竞态条件。

没有 Abort 时的竞态条件

如果没有 AbortController,用户输入“re”、等待片刻后再输入“react”时,第二个查询可能会因为缓存而先于第一个查询返回。搜索结果会短暂显示 React 的结果,随后又被过时的“re”结果覆盖。AbortController 会通过完全取消较早的请求来避免这种情况。

自动完成下拉菜单模式

下拉菜单将接口请求的防抖与输入显示的即时状态结合起来。inputValue 控制文本框中显示的内容。useDebounce(inputValue, 250) 控制何时发起建议获取请求。建议列表根据获取结果状态进行渲染,该状态与这两个输入状态彼此独立。

限流的异步验证

异步表单验证(例如检查电子邮件地址是否已存在)应使用防抖,以免每次按键都向服务器发送请求。请对字段值使用 400 毫秒的防抖,并在依赖防抖值的 useEffect 中发起验证请求。验证等待期间,请在字段中显示加载旋转指示器。

使用防抖自动保存表单

防抖非常适合在用户输入时自动保存表单内容。请对表单值对象设置 1000 毫秒的防抖。当防抖值发生变化时,触发保存到 localStorage 或接口端点的操作。防抖等待期间,用户会看到“正在保存……”指示器,请求完成后则显示“已保存”。

选择合适的延迟

延迟值属于用户体验决策。对于搜索,200 到 300 毫秒可以在响应速度和减少请求之间取得平衡。对于调整大小,150 到 200 毫秒是可以接受的,因为用户预期布局会在调整后稳定下来。对于自动保存,1000 毫秒能让用户有时间输入一个句子后再保存。请根据预期的交互速度进行调整。

组合多种技术

实际应用通常需要同时进行多项优化。文档编辑器可能会对自动保存使用防抖(1 秒),对字数计算使用节流(500 毫秒),并使用 IntersectionObserver 进行分析。这些技术很容易组合,因为每种技术都在自己的计时器和范围内独立运行。

将防抖与 AbortController 结合使用

为什么应该将 AbortController 与防抖的搜索查询结合使用?

课程回顾:实用的防抖与节流

请对搜索输入、调整大小处理函数和表单自动保存使用 useDebounce。请对滚动和鼠标移动使用 useThrottle。始终将经过防抖的接口请求与 AbortController 结合使用,以避免竞态条件。当 inputValue !== debouncedQuery 时,请始终显示加载状态,从而让用户界面保持响应并提供清晰反馈。

常见问题解答

「实际应用:搜索、滚动和调整大小」课时是免费的吗?

是的 — 「实际应用:搜索、滚动和调整大小」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 React Academy 课程的其余内容,请升级到 CoddyKit PRO。 React Academy 课程共包含 4 节课。

「实际应用:搜索、滚动和调整大小」这节课中我会学到什么?

在真实组件示例中,将防抖应用于搜索输入,将节流应用于滚动和调整大小监听器。 你通过在浏览器中直接运行的动手代码来练习 React Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 React Academy 需要有经验吗?

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

「实际应用:搜索、滚动和调整大小」课时需要多长时间?

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

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

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

此课程中的所有课时

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