/* 需求:防止按钮在短时间内被多次点击,使用节流函数限制规定时间内只能点击一次。 思路: 1、第一次点击,立即调用方法并禁用按钮,等延迟结束再次激活按钮 2、将需要触发的方法绑定在指令上 使用:给 Dom 加上 v-throttle 及回调函数即可 */ import type { Directive, DirectiveBinding } from "vue"; interface ElType extends HTMLElement { __handleClick__: () => any; disabled: boolean; } const throttle: 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) { clearTimeout(timer); } if (!el.disabled) { el.disabled = true; binding.value(); timer = setTimeout(() => { el.disabled = false; }, 1000); } }; el.addEventListener("click", el.__handleClick__); }, beforeUnmount(el: ElType) { el.removeEventListener("click", el.__handleClick__); } }; export default throttle;