useDebounce
React hook to delay the execution of function or state update.
Add the hook via the CLI:
sh
npx @novajslabs/cli add useDebounce
sh
npx @novajslabs/cli add useDebounce
sh
pnpm dlx @novajslabs/cli add useDebounce
Or copy and paste the code into your project:
ts
import { useEffect, useState } from "react";
export const useDebounce = <T>(value: T, delay: number) => {
const [debouncedValue, setDebouncedValue] = useState<T>(value);
useEffect(() => {
const handleTimeout = setTimeout(() => {
setDebouncedValue(value);
}, delay);
return () => {
clearTimeout(handleTimeout);
};
}, [value, delay]);
return debouncedValue;
};
js
import { useEffect, useState } from "react";
export const useDebounce = (value, delay) => {
const [debouncedValue, setDebouncedValue] = useState(value);
useEffect(() => {
const handleTimeout = setTimeout(() => {
setDebouncedValue(value);
}, delay);
return () => {
clearTimeout(handleTimeout);
};
}, [value, delay]);
return debouncedValue;
};
Requirements
React 16.8 or higher
Parameters
value required
- Type:
any
The value that you want to debounce.
delay required
- Type:
number
The delay time in milliseconds. After this time, the latest value is used.
Return values
debouncedValue
- Type:
any
The debounced value. After the delay time has passed without the value changing, this will be updated to the latest value.
Example
tsx
import { useState } from "react";
import { useDebounce } from "./hooks/useDebounce";
const fruits = [
"Apple",
"Banana",
"Mango",
"Grapes",
"Papaya",
"Coconut",
"Guava",
"Orange",
"Pineapple",
"Watermelon",
];
const App = () => {
const [searchTerm, setSearchTerm] = useState("");
const debouncedSearchTerm = useDebounce(searchTerm, 500);
const filteredFruits = fruits.filter((fruit) =>
fruit.toLowerCase().includes(debouncedSearchTerm.toLowerCase())
);
return (
<div>
<input
type="text"
placeholder="Search..."
value={searchTerm}
onChange={(e) => setSearchTerm(e.target.value)}
/>
<ul>
{filteredFruits.map((item, index) => (
<li key={index}>{item}</li>
))}
</ul>
</div>
);
};
export default App;
Use cases
Here are some use cases where this React hook is useful:
- Debouncing a search input to avoid excessive API calls
- Delaying the execution of a function to wait for user pause in typing
- Reducing the frequency of state updates in response to user actions
- Improving performance by limiting the number of renders caused by fast-changing values