31 lines
757 B
TypeScript
31 lines
757 B
TypeScript
import { DirectiveBinding } from 'vue';
|
|
|
|
let debounceTimer: NodeJS.Timeout | null;
|
|
|
|
export const debounce = {
|
|
mounted(el: HTMLElement, binding: DirectiveBinding) {
|
|
const eventType: string = Object.keys(binding.modifiers)[0] || 'click';
|
|
|
|
el.addEventListener(eventType, () => {
|
|
const dealy: number = binding.arg ? parseInt(binding.arg) : 300;
|
|
const fn: unknown = binding.value;
|
|
|
|
if (isNaN(dealy)) {
|
|
throw Error('v-debounce:arg必须为数字!');
|
|
}
|
|
|
|
if (typeof fn !== 'function') {
|
|
throw Error('v-debounce绑定值必须为函数!');
|
|
}
|
|
|
|
if (debounceTimer) {
|
|
clearTimeout(debounceTimer);
|
|
}
|
|
|
|
debounceTimer = setTimeout(() => {
|
|
fn();
|
|
}, dealy);
|
|
});
|
|
},
|
|
};
|