mirror of
https://github.com/bufanyun/hotgo.git
synced 2025-11-15 05:33:47 +08:00
42 lines
1.1 KiB
TypeScript
42 lines
1.1 KiB
TypeScript
/*
|
||
需求:防止按钮在短时间内被多次点击,使用节流函数限制规定时间内只能点击一次。
|
||
|
||
思路:
|
||
1、第一次点击,立即调用方法并禁用按钮,等延迟结束再次激活按钮
|
||
2、将需要触发的方法绑定在指令上
|
||
|
||
使用:给 Dom 加上 v-throttle 及回调函数即可
|
||
<button v-throttle="debounceClick">节流提交</button>
|
||
*/
|
||
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;
|