import { useCallback, useEffect, useRef, useState } from 'react'; /** * 防抖 Hook * 延迟执行函数,直到停止调用一段时间后才执行 * * @param value - 要防抖的值 * @param delay - 延迟时间(毫秒) * @returns 防抖后的值 */ export function useDebounce(value: T, delay: number = 500): T { const [debouncedValue, setDebouncedValue] = useState(value); useEffect(() => { const handler = setTimeout(() => { setDebouncedValue(value); }, delay); return () => { clearTimeout(handler); }; }, [value, delay]); return debouncedValue; } /** * 防抖回调 Hook * 延迟执行回调函数 * * @param callback - 要防抖的回调函数 * @param delay - 延迟时间(毫秒) * @returns 防抖后的回调函数 */ export function useDebouncedCallback unknown>( callback: T, delay: number = 500 ): (...args: Parameters) => void { const timeoutRef = useRef(undefined); const callbackRef = useRef(callback); // 保持最新的 callback 引用 useEffect(() => { callbackRef.current = callback; }, [callback]); useEffect(() => { return () => { if (timeoutRef.current) { clearTimeout(timeoutRef.current); } }; }, []); return useCallback( (...args: Parameters) => { if (timeoutRef.current) { clearTimeout(timeoutRef.current); } timeoutRef.current = setTimeout(() => { callbackRef.current(...args); }, delay); }, [delay] ); } export default useDebounce;