前端-防重复点击/防抖的方案

前端防抖的方案

自定义指令
直接使用自定义指令dom上控制,一般的防重复点击够用。

  • 在组件上绑定自定义指令监听点击事件,触发后立即禁用按钮元素,延迟后恢复。默认禁用时间为3000毫秒,支持自定义时长。
import { Directive } from 'vue'
const preventRepeatClick: Directive<HTMLElement, number | undefined> = {
  mounted(el, binding) {
    el.addEventListener('click', () => {
      if (!el.disabled) {
        el.disabled = true
        const delay = binding.value ?? 3000
        setTimeout(() => (el.disabled = false), delay)
      }
    })
  }
}

适用场景

  • 表单提交按钮(防重复)
  • 需要直接操作DOM状态的场景

防抖函数

lodash.debounce实现
通过防抖函数包装控制执行频率,连续触发时仅执行最后一次。

import { debounce } from 'lodash'
const debouncedSearch = debounce(searchHandler, 500)

不适用场景

  • 弱网环境会有问题:因为响应超出了防抖时间

业务层提交锁方案

状态标记控制
使用isSubmitting状态变量进行逻辑拦截,确保异步操作完整性。

const isSubmitting = ref(false)
const handleSubmit = async () => {
  if (isSubmitting.value) return
  isSubmitting.value = true
  try {
    await submitApi()
  } finally {
    isSubmitting.value = false
  }
}

适用场景

  • 各种场景

方案选型建议

  • 看实际要求,普通情况自定义指令即可。
  • 考虑交互弱网使用锁。
  • 常见的表单搜索使用防抖函数即可

组合使用策略

  1. 高频UI事件:防抖函数
  2. 按钮点击:自定义指令+提交锁
  3. 关键业务:必须使用提交锁
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值