节流与防抖

53 阅读2分钟

一、节流与防抖在本项目中的应用与封装

1. 项目中节流与防抖的应用场景

在本项目(如 web-company),节流和防抖常用于优化高频事件处理,比如搜索输入、窗口滚动、按钮点击等,防止因事件触发过于频繁导致性能问题或重复请求。

2. 已有封装(web-company/src/utils/throttleAndDebounce.ts)

throttleAndDebounce.ts 工具文件,会封装如下:

// 节流
export function throttle(fn: Function, delay: number) {
  let last = 0
  return function (...args: any[]) {
    const now = Date.now()
    if (now - last > delay) {
      last = now
      fn.apply(this, args)
    }
  }
}

// 防抖
export function debounce(fn: Function, delay: number) {
  let timer: any = null
  return function (...args: any[]) {
    clearTimeout(timer)
    timer = setTimeout(() => {
      fn.apply(this, args)
    }, delay)
  }
}

3. 应用示例

  • 防抖:在 SearchBar.vue 组件中,用户输入时防止频繁请求接口。
  • 节流:在页面滚动监听、窗口 resize 事件等场景,防止高频触发导致性能下降。

示例:防抖搜索

import { debounce } from '@/utils/throttleAndDebounce'

const onInput = debounce((val: string) => {
  // 发送搜索请求
}, 300)

二、问题

1. 问:节流和防抖的区别是什么?项目中分别用在了哪些场景?

答:
节流是指在一定时间内只执行一次函数,适合高频但不需每次都响应的场景,如滚动、resize 事件。防抖是指事件触发后延迟一段时间执行,如果期间再次触发则重新计时,适合输入框搜索、按钮防重复提交等。项目中,搜索输入用防抖,滚动监听用节流。


2. 问:你是如何在项目中封装节流和防抖函数的?

答:
我在 web-company/src/utils/throttleAndDebounce.ts 封装了通用的 throttle 和 debounce 函数,分别基于时间戳和 setTimeout 实现。这样在各个组件中都能直接引入复用,提升了代码的可维护性和一致性。


3. 问:防抖函数在搜索组件中的具体应用是怎样的?

答:
SearchBar.vue 组件中,用户每次输入都会触发 onInput 事件。我用 debounce 包裹搜索请求函数,只有用户停止输入 300ms 后才真正发起请求,避免了每次输入都请求接口,减少了服务器压力和无效请求。


4. 问:节流函数在页面滚动监听中的应用是怎样的?

答:
在首页或产品列表页监听 window 的 scroll 事件时,我用 throttle 包裹滚动处理函数,每 200ms 只执行一次,防止滚动事件高频触发导致页面卡顿,提升了页面的流畅性和性能。


5. 问:你如何保证节流和防抖函数的可复用性和易用性?项目中有哪些实践?

答:
我将节流和防抖函数单独封装在 utils 目录,参数设计灵活,支持传递 this 和参数。所有需要高频事件优化的地方都统一调用,避免了重复实现和潜在 bug,极大提升了项目的可维护性和开发效率。