use-debounced-value

Debounce value changes
Import

Usage

use-debounced-value hook debounces value changes. This can be useful in case you want to perform a heavy operation based on react state, for example, send search request. Unlike use-debounced-state it is designed to work with controlled components.

Value: [empty string]
Debounced value: [empty string]
import { useState } from 'react';
import { useDebouncedValue } from '@mantine/hooks';
import { TextInput, Text } from '@mantine/core';
function Demo() {
const [value, setValue] = useState('');
const [debounced] = useDebouncedValue(value, 200);
return (
<>
<TextInput
label="Enter value to see debounce"
value={value}
style={{ flex: 1 }}
onChange={(event) => setValue(event.currentTarget.value)}
/>
<Text>Value: {value}</Text>
<Text>Debounced value: {debounced}</Text>
</>
);
}

Differences to useDebouncedState

This hook differs slightly from the useDebouncedState hook.

  • You have direct access to the non-debounced value.
  • It is used for controlled inputs (value prop instead of defaultValue), e.g. renders on every state change like a character typed in an input.
  • It works with props or other state providers, and it does not force use of useState.

Leading update

You can immediately update value with first call with { leading: true } options:

Value: [empty string]
Debounced value: [empty string]
import { useState } from 'react';
import { useDebouncedValue } from '@mantine/hooks';
import { TextInput, Text } from '@mantine/core';
function Demo() {
const [value, setValue] = useState('');
const [debounced] = useDebouncedValue(value, 200, { leading: true });
return (
<>
<TextInput
label="Enter value to see debounce"
value={value}
style={{ flex: 1 }}
onChange={(event) => setValue(event.currentTarget.value)}
/>
<Text>Value: {value}</Text>
<Text>Debounced value: {debounced}</Text>
</>
);
}

Cancel update

Hook provides cancel callback, you can use it to cancel update. Update cancels automatically on component unmount.

In this example, type in some text and click cancel button within a second to cancel debounced value change:

Value: [empty string]
Debounced value: [empty string]
import { useState } from 'react';
import { useDebouncedValue } from '@mantine/hooks';
import { TextInput, Text, Button } from '@mantine/core';
function Demo() {
const [value, setValue] = useState('');
const [debounced, cancel] = useDebouncedValue(value, 1000);
return (
<>
<TextInput
label="Enter value to see debounce"
value={value}
style={{ flex: 1 }}
onChange={(event) => setValue(event.currentTarget.value)}
/>
<Button onClick={cancel} size="lg" style={{ marginLeft: 15 }}>
Cancel
</Button>
<Text>Value: {value}</Text>
<Text>Debounced value: {debounced}</Text>
</>
);
}

Definition

function useDebouncedValue<T = any>(
value: T,
wait: number,
options?: {
leading: boolean;
}
): readonly [T, () => void];