DEV Community

Cover image for Mastering Debouncing in React: A Clean and Scalable Approach with Custom Hooks
Jenish Dabhi
Jenish Dabhi

Posted on

Mastering Debouncing in React: A Clean and Scalable Approach with Custom Hooks

In modern web development, performance optimization plays a crucial role in ensuring a smooth and responsive user experience. One such optimization technique is debouncing, particularly useful when dealing with high-frequency user inputs, like search fields or form validations. In this blog post, we will explore how to implement debouncing in React with a custom hook, which offers a scalable and reusable solution.

Why is Debouncing Important?

Performance Optimization: Sending multiple API requests for every keystroke or interaction can overwhelm your server and impact the performance of your app. By debouncing, you can reduce the number of network requests and optimize the user experience.

Prevents Unnecessary Operations : Whether it's making API calls, triggering a form submission, or running expensive computations, debouncing ensures that these actions happen only when needed.

Smoother User Experience : By reducing the number of operations, the app becomes more responsive, even under heavy user interaction.

Code Example: Debouncing with useDebouncedValue Hook

Step 1 : The Custom Hook

We start by creating a custom hook, useDebouncedValue, which handles the debouncing logic:

import { useState, useEffect } from 'react'
    const useDebouncedValue = (inputValue, delay) => {
    const [debouncedValue, setDebouncedValue] = useState(inputValue)

        useEffect(() => {
            const handler = setTimeout(() => {
                setDebouncedValue(inputValue);
            }, delay);

            return () => {
                clearTimeout(handler);
            };
        }, [inputValue, delay]);

        return debouncedValue;
    };
Enter fullscreen mode Exit fullscreen mode

Step 2: The Component Using the Custom Hook

Now that we have the custom hook, we can use it in a component to debounce the search input:

import React, { useState, useEffect } from 'react';
import useDebouncedValue from './useDebouncedValue';  // Import the custom hook

export default function App() {
  const [value, setValue] = useState('');

  // Using the debounced value with a 500ms delay
  const debouncedSearchTerm = useDebouncedValue(value, 500);

  useEffect(() => {
    // API call or other actions based on the debounced value
    if (debouncedSearchTerm) {
      // Here you can make your API call
    }
  }, [debouncedSearchTerm]);
  return (
    <div>
      <input
        type="text"
        value={value}
        onChange={(e) => setValue(e.target.value)}
        placeholder="Search..."
      />
    </div>
  );
}
Enter fullscreen mode Exit fullscreen mode

Explanation:

1.State Management : The component has a state value that updates as the user types in the input field.

2.Using the Custom Hook : The useDebouncedValue hook is used to get the debounced value, debouncedSearchTerm, with a delay of 500ms.

3.Effect Hook : Once the debounced value changes, the useEffect hook is triggered. This is where you can place your logic, such as an API call or filtering action.

4.clearTimeout Cleanup : Inside the useDebouncedValue hook, we ensure that any previously set timeout is cleared on every render or when the value changes. This avoids multiple timeouts running at the same time.

Conclusion

Debouncing is a powerful technique to improve performance and user experience, especially when dealing with user inputs like search fields or form validations. By using a custom hook in React, we can easily implement debouncing in a clean, reusable, and scalable way.

With the useDebouncedValue hook, you can manage debounced values in your React components without cluttering the logic. This modular approach makes your codebase more maintainable and optimizes performance for applications that rely on rapid user input.

Thank you for reading.
Happy coding!

Top comments (0)