/** * 防抖:在连续的操作中,无论进行了多长时间,只有某一次的操作后在指定的时间内没有再操作,这一次才被判定有效。 * 使用: * 按钮防抖 * 按钮防抖传参 */ import { ObjectDirective } from 'vue' interface DebounceEl extends HTMLElement { debounceEvent: () => void } // 防抖指令封装 const debounceDirective: ObjectDirective = { beforeMount(el: DebounceEl, binding: any) { let timer: number let delay: number = 1000 const keys = Object.keys(binding.modifiers) if (keys) { const key: string | undefined = keys.find((key) => key.includes('delay'))?.toString() const value = (key ?? '').match(/(?<=\[).*?(?=\])/) if (value) delay = parseInt(value[0]) } el.debounceEvent = () => { clearTimeout(timer) timer = window.setTimeout(() => { binding.value() }, delay) } el.addEventListener(binding.arg, el.debounceEvent) }, beforeUnmount(el: DebounceEl, binding: any) { el.removeEventListener(binding.arg, el.debounceEvent) }, } export default debounceDirective