按钮防抖指令

733 阅读1分钟

防抖的意思

防抖的字面意思就是防止抖动,在开发领域的理解就是防止频繁进行其他操作,限制频率,只执行一次操作。常见的场景,发送短信,支付等。

防抖的核心思想

实现防抖的核心思想就是在规定的时间间隔内只触发最后一次。通过定时器控制事件的触发频率,其关键点就是在于每点击一次就清空定时器重新计时,假设设置防抖的时间是1s,也就是在这1s内无论点击多少次,都清空定时器,从点击的那一刻重新计时,假设第一次点击的时刻是0s,最后点击的那次时刻是0.5s,那么真正触发事件的时刻是在1.5s。

  • 实现代码
/**
 * v-debounce  按钮防抖指令,
 * 功能:多次点击按钮会多次触发事件,如果是在表单提交就会多次调用后端接口,就会达不到需求,防止多次触发。
 * 通过监听点击事件设置定时器,设置几秒内才触发点击事件,通过绑定和解绑移除事件。
 * 接收参数:function类型
 */
import type { Directive, DirectiveBinding } from "vue";
interface ElType extends HTMLElement {
  __handleClick__: () => any;
}
const debounce: Directive = {
  mounted(el: ElType, binding: DirectiveBinding) {
    if (typeof binding.value !== "function") {
      throw "callback must be a function";
    }
    let timer: NodeJS.Timeout | null = null;
    el.__handleClick__ = function () {
      if (timer) {
        clearInterval(timer);
      }
      timer = setTimeout(() => {
        binding.value();
      }, 500);
    };
    el.addEventListener("click", el.__handleClick__);
  },
  beforeUnmount(el: ElType) {
    el.removeEventListener("click", el.__handleClick__);
  },
};

export default debounce;