Skip to content

debounceClick 防抖点击指令

用于对点击事件进行防抖处理,避免用户快速连续点击导致重复触发。支持领先/尾随触发、阻止默认行为、阻止冒泡等配置。

安装与引入

按需导入(推荐)

ts
import { VDebounceClick } from '@cuixingjian/cui-utils'

全局注册

ts
import { createApp } from 'vue'
import { VDebounceClick } from '@cuixingjian/cui-utils'

const app = createApp(App)
app.directive('debounce-click', VDebounceClick)
app.mount('#app')

局部注册

vue
<script setup lang="ts">
import { VDebounceClick as vDebounceClick } from '@cuixingjian/cui-utils'
</script>

<template>
  <button v-debounce-click="handler">点击</button>
</template>

效果演示

基础用法

快速连续点击按钮,只会在停止点击后触发一次。

使用代码

直接传入函数(默认 200ms):

vue
<template>
  <button v-debounce-click="onSubmit">提交</button>
</template>

<script setup lang="ts">
function onSubmit(e: Event) {
  console.log('提交表单')
}
</script>

自定义等待时间:

vue
<template>
  <button v-debounce-click="{ wait: 500, onClick: onSearch }">搜索</button>
</template>

领先触发(第一次点击立即执行):

vue
<template>
  <button v-debounce-click="{ leading: true, trailing: false, onClick: onSave }">
    保存
  </button>
</template>

API 说明

指令值类型

类型说明示例
Function直接传入处理函数v-debounce-click="handler"
Object传入配置对象v-debounce-click="{ wait: 500, onClick: handler }"

配置选项 (DebounceClickOptions)

参数类型默认值说明
waitnumber200防抖等待时间(毫秒)
leadingbooleanfalse是否在首次点击时立即触发
trailingbooleantrue是否在等待结束后触发
enabledbooleantrue是否启用防抖
preventbooleanfalse是否阻止默认行为
stopbooleanfalse是否阻止事件冒泡
capturebooleanfalse是否在捕获阶段监听
onClick(event: Event) => void防抖后执行的处理函数

注意事项

触发模式

尾随触发(默认):

  • 每次点击重置计时器
  • 停止点击后等待 wait 毫秒触发一次
  • 适合表单提交、搜索等场景

领先触发:

  • 第一次点击立即触发
  • 后续点击在 wait 窗口内被抑制
  • 适合需要即时反馈的场景(如收藏)

组合模式:

  • leading: true, trailing: true:首次立即触发,窗口结束后再触发一次
  • leading: true, trailing: false:仅首次触发,窗口内点击被忽略

常见场景

  • 表单提交:防止重复提交(wait: 300-500ms
  • 搜索按钮:避免频繁请求(wait: 300ms
  • 保存/收藏:防止多次API调用(leading: true

最佳实践

  • 写入操作建议 wait >= 300ms
  • 即时反馈操作使用 leading: true
  • 与路由跳转配合时开启 prevent

源码展示

展开查看完整源码
ts
import type { Directive } from 'vue'
import { withInstallDirective } from '../install'

export interface DebounceClickOptions {
  wait?: number
  leading?: boolean
  trailing?: boolean
  enabled?: boolean
  prevent?: boolean
  stop?: boolean
  capture?: boolean
  onClick?: (event: Event) => void
}

// 详见 packages/utils/directives/debounceClick.ts
export const VDebounceClick = withInstallDirective(debounceClick, 'debounce-click')