32 lines
861 B
TypeScript
32 lines
861 B
TypeScript
const debounce = (fn: (...args: any[]) => void, delay = 0, immediate = false) => {
|
|
let timeout: string | number | NodeJS.Timeout
|
|
return (...args: any[]) => {
|
|
if (immediate && !timeout) fn(...args)
|
|
clearTimeout(timeout)
|
|
|
|
timeout = setTimeout(() => {
|
|
fn(...args)
|
|
}, delay)
|
|
}
|
|
}
|
|
|
|
const useDebouncedRef = (initialValue: any, delay?: number, immediate?: boolean) => {
|
|
const state = ref(initialValue)
|
|
const debouncedRef = customRef((track: () => void, trigger: () => void) => ({
|
|
get() {
|
|
track()
|
|
return state.value
|
|
},
|
|
set: debounce(
|
|
(value: any) => {
|
|
state.value = value
|
|
trigger()
|
|
},
|
|
delay,
|
|
immediate
|
|
),
|
|
}))
|
|
return debouncedRef
|
|
}
|
|
|
|
export default useDebouncedRef |