Create a custom debounce Hook in React

Sumit kumar Singh

--

Custom debounce hooks in React allow you to control the frequency at which a function is called, ensuring that it is only executed after a certain delay. This is useful when dealing with events that trigger frequently, such as user input or scrolling, and you want to optimize performance by reducing unnecessary function calls. In this article, we will explore debounce hooks in-depth and provide an example of their usage in a React application.

What is Debouncing?

Debouncing is a technique used to limit the frequency at which a function is invoked. It is particularly useful when handling events that fire rapidly, such as key presses or scroll events. Instead of executing the function immediately on every event, debouncing allows you to delay the execution until a specified period of inactivity has passed. This helps to optimize performance and reduce unnecessary function calls.

Implementing a Debounce Hook

To create a custom debounce hook in React, we can leverage the useEffect and useRef hooks. Here's an example implementation:

import { useEffect, useRef } from 'react';

const useDebounce = (callback, delay) => {
const timeoutRef = useRef(null);

useEffect(() => {
// Cleanup the previous timeout on re-render
return () => {
if (timeoutRef.current) {
clearTimeout(timeoutRef.current);
}
};
}, []);

const debouncedCallback = (...args) => {
if (timeoutRef.current) {
clearTimeout(timeoutRef.current);
}

timeoutRef.current = setTimeout(() => {
callback(...args);
}, delay);
};

return debouncedCallback;
};

In this example, we define the useDebounce hook that takes two parameters: callback, which represents the function to be debounced, and delay, which specifies the debounce delay in milliseconds.

We use the useRef hook to create a mutable reference, timeoutRef, to keep track of the timeout ID. This reference will persist across re-renders.

Inside the useEffect hook, we clean up the previous timeout on re-render by clearing the timeout if it exists. This ensures that the debounce behaviour remains consistent even if the component re-renders frequently.

The debouncedCallback function is returned from the hook. It checks if there is an existing timeout and clears it before setting a new timeout using setTimeout. The actual callback function is invoked after the specified delay.

Using the Debounce Hook

Once the custom debounces hook is implemented, you can use it in your React components. Here’s an example of how you can use the useDebounce hook to debounce a search input:

import React, { useState } from 'react';
import useDebounce from './useDebounce';

const SearchInput = () => {
const [searchTerm, setSearchTerm] = useState('');

const handleSearch = useDebounce((term) => {
// Perform search operation with the debounced term
console.log('Searching for:', term);
}, 500);

const handleChange = (event) => {
const { value } = event.target;
setSearchTerm(value);

// Debounce the search callback
handleSearch(value);
};

return (
<input
type="text"
value={searchTerm}
onChange={handleChange}
placeholder="Search..."
/>
);
};

In this example, we have a SearchInput component that renders an input field. We use the useState hook to maintain the search term state. The handleSearch function is obtained by calling the useDebounce hook, passing the search callback function and a delay of 500 milliseconds.

Inside the handleChange function, we update the search term state and call the handleSearch function, which is debounced using the useDebounce hook. The debounced function will only be invoked after the specified delay of inactivity.

Conclusion

Custom debounce hooks in React are a powerful tool for optimizing performance by controlling the frequency of function invocations. By debouncing event handlers, you can reduce unnecessary function calls and improve the responsiveness of your application. By using the useEffect and useRef hooks, you can implement a custom debounce hook that can be easily reused across your React components.

--

--

Sumit kumar Singh

YouTube: https://www.youtube.com/@tech..Design/ 📚 HTML,Angular, React,and JavaScript 🧑‍💻 Tips & tricks on Web Developing 👉 FULL STACK DEVELOPER