Skip to content

debounce

debounce 用于把一段高频触发的调用压缩为一次执行。

在等待时间内如果再次触发,会重新计时;常用于输入搜索、按钮防连点和频繁状态同步。

签名

ts
function debounce<T extends (...args: unknown[]) => unknown>(
  fn: T,
  wait: number,
  immediate?: boolean
): ((...args: Parameters<T>) => void) & { cancel: () => void }

示例

ts
import { debounce } from 'bzsh-ui'

const requestSuggestions = debounce((keyword: string) => {
  console.log('search:', keyword)
}, 300)

requestSuggestions('v')
requestSuggestions('vu')
requestSuggestions('vue')

300ms 内连续触发时,只有最后一次参数会真正执行。

也可以通过聚合对象调用:

ts
import { func } from 'bzsh-ui'

const requestSuggestions = func.debounce((keyword: string) => {
  console.log('search:', keyword)
}, 300)

立即执行模式

ts
import { debounce } from 'bzsh-ui'

const submit = debounce(
  () => {
    console.log('submit once')
  },
  1000,
  true
)

immediatetrue 时,第一次调用会立即执行,后续在等待时间内的重复触发会被忽略。

取消执行

ts
const saveDraft = debounce(() => {
  console.log('save')
}, 500)

saveDraft()
saveDraft.cancel()

适用场景

  • 输入框联想、远程搜索。
  • 防止按钮短时间内被重复点击。
  • 需要只保留最后一次状态更新的场景。

继续阅读