31 lines
660 B
TypeScript
31 lines
660 B
TypeScript
import { customRef } from 'vue'
|
|
|
|
/**
|
|
* 创建防抖的响应式引用
|
|
* @param value - 初始值
|
|
* @param delay - 防抖延迟时间(毫秒),默认 200ms
|
|
* @returns 防抖的响应式引用
|
|
*/
|
|
export function useDebouncedRef<T>(value: T, delay: number = 300) {
|
|
let timeout: ReturnType<typeof setTimeout> | null = null
|
|
|
|
return customRef((track, trigger) => {
|
|
return {
|
|
get() {
|
|
track()
|
|
return value
|
|
},
|
|
set(newValue: T) {
|
|
if (timeout) {
|
|
clearTimeout(timeout)
|
|
}
|
|
|
|
timeout = setTimeout(() => {
|
|
value = newValue
|
|
trigger()
|
|
}, delay)
|
|
}
|
|
}
|
|
})
|
|
}
|