useDebounce

React hook to debounce state updates and function calls with custom delay, immediate value tracking, and change callbacks.

pnpm add react-callback-hooks

Demo

Search products e.g. "iphone"
Type to search...

Usage

Shorthand — callback + delay:

import { useDebounce } from 'react-callback-hooks'

export default function SearchInput() {
  const [debouncedValue, setValue, immediateValue] = useDebounce(
    (searchTerm) => {
      fetchResults(searchTerm)
    },
    500
  )

  return (
    <input
      value={immediateValue ?? ''}
      placeholder="Search..."
      onChange={(e) => setValue(e.target.value)}
    />
  )
}

Object form — full configuration:

import { useDebounce } from 'react-callback-hooks'

const [debouncedQuery, setQuery, currentQuery] = useDebounce({
  delay: 400,
  defaultValue: '',
  onChange: (value) => console.log('Immediate keystroke:', value),
  onDebounced: (value) => console.log('Debounced search:', value)
})

Parameters

Shorthand form

ParameterTypeDefaultDescription
callback(value: T) => voidCallback invoked once delay ms have passed without changes.
delaynumber500Debounce delay in milliseconds.

Object form

PropertyTypeDefaultDescription
delaynumber500Debounce delay in milliseconds.
onDebounced(value: T) => voidCallback fired after the debounced delay elapses.
onChange(value: T) => voidImmediate callback fired whenever setValue is called.
defaultValueTundefinedInitial value for both immediate and debounced state.

Return Values

Returns a tuple [debouncedValue, setValue, immediateValue]:

IndexTypeDescription
debouncedValueT | undefinedThe value updated only after the debounce delay expires.
setValue(value: T) => voidSetter function to update the value and start the debounce timer.
immediateValueT | undefinedThe immediate, un-debounced value (useful for controlled inputs).