import { ref, watch } from 'vue' import { tryOnUnmounted } from '@vueuse/core' import { isFunction } from '/@/utils/is' export function useTimeoutFn(handle: Fn, wait: number, native = false) { if (!isFunction(handle)) { throw new Error('handle is not Function!') } const { readyRef, stop, start } = useTimeoutRef(wait) if (native) { handle() } else { watch( readyRef, (maturity) => { maturity && handle() }, { immediate: false }, ) } return { readyRef, stop, start } } export function useTimeoutRef(wait: number) { const readyRef = ref(false) let timer: TimeoutHandle function stop(): void { readyRef.value = false timer && window.clearTimeout(timer) } function start(): void { stop() timer = setTimeout(() => { readyRef.value = true }, wait) } start() tryOnUnmounted(stop) return { readyRef, stop, start } }