UNPKG

use-hook-kits

Version:

![npm](https://img.shields.io/npm/dt/use-hook-kits.svg) ![npm](https://img.shields.io/npm/v/use-hook-kits.svg) ![NpmLicense](https://img.shields.io/npm/l/use-hook-kits.svg)

32 lines (28 loc) 996 B
import { useCallback, useEffect, useRef, useState } from 'react'; import useDebouncedCallback from './useDebounceCallback'; function valueEquality(left,right) { return left === right; } //{ maxWait?: number; leading?: boolean; trailing?: boolean; equalityFn?: (left: T, right: T) => boolean } export default function useDebounce( value, delay, options ) { const eq = options && options.equalityFn ? options.equalityFn : valueEquality; const [state, dispatch] = useState(value); const [callback, cancel, callPending] = useDebouncedCallback( useCallback((value) => dispatch(value), []), delay, options ); const previousValue = useRef(value); useEffect(() => { // We need to use this condition otherwise we will run debounce timer for the first render (including maxWait option) if (!eq(previousValue.current, value)) { callback(value); previousValue.current = value; } }, [value, callback, eq]); return [state, cancel, callPending]; }