(
value: T,
delay: number,
options?: {
maxWait?: number;
leading?: boolean;
trailing?: boolean;
equalityFn?: (left: T, right: T) => boolean;
}
)
| 6 | } |
| 7 | |
| 8 | export default function useDebounce<T>( |
| 9 | value: T, |
| 10 | delay: number, |
| 11 | options?: { |
| 12 | maxWait?: number; |
| 13 | leading?: boolean; |
| 14 | trailing?: boolean; |
| 15 | equalityFn?: (left: T, right: T) => boolean; |
| 16 | } |
| 17 | ): [T, DebouncedState<(value: T) => void>] { |
| 18 | const eq = (options && options.equalityFn) || valueEquality; |
| 19 | |
| 20 | const activeValue = useRef(value); |
| 21 | const [, forceUpdate] = useState({}); |
| 22 | const debounced = useDebouncedCallback( |
| 23 | useCallback( |
| 24 | (value: T) => { |
| 25 | activeValue.current = value; |
| 26 | forceUpdate({}); |
| 27 | }, |
| 28 | [forceUpdate] |
| 29 | ), |
| 30 | delay, |
| 31 | options, |
| 32 | forceUpdate |
| 33 | ); |
| 34 | const previousValue = useRef(value); |
| 35 | |
| 36 | if (!eq(previousValue.current, value)) { |
| 37 | debounced(value); |
| 38 | previousValue.current = value; |
| 39 | } |
| 40 | |
| 41 | return [activeValue.current as T, debounced]; |
| 42 | } |
searching dependent graphs…