The Power of Debouncing and Throttling in React
The City Filter Problem
Imagine searching for a city in a large list of data. As you type, the input field becomes unresponsive due to the massive amount of processing required. This is because the computer processor has to filter through the entire list of data for each keystroke, resulting in a significant delay.
Introducing Debouncing and Throttling
Debouncing and throttling are two techniques that prevent a function from running multiple instances at the same time. Debouncing delays the execution of a function until a certain amount of time has passed since the last invocation, while throttling limits the number of times a function can be called within a given interval.
Solving the City Filter Problem with Debouncing
In our city filter app, we’ll use debouncing to solve the problem. When a user types “S”, we wait for half a second before filtering through the large list of data. If the user continues typing, we start waiting again from the last keystroke. This approach ensures that our filter function runs only once, making our app responsive and efficient.
Implementing Debouncing with JavaScript setTimeout
We can use the setTimeout()
method to implement debouncing in JavaScript. By delaying the execution of our filter function, we can prevent it from running multiple times. However, we need to cancel the previous timeout before creating a new one to ensure that our function runs only once.
let timeoutId;
const handleInputChange = (event) => {
if (timeoutId) {
clearTimeout(timeoutId);
}
timeoutId = setTimeout(() => {
// filter function implementation
}, 500);
};
Using Lodash to Debounce
Lodash provides a debounce
method that offers more functionalities than our initial implementation. We can install just the debounce
function and use it to debounce our filter function. However, we need to use React’s useCallback
Hook to prevent our function from being recreated each time the input field changes.
import debounce from 'lodash.debounce';
const handleInputChange = debounce((event) => {
// filter function implementation
}, 500);
Throttling with Lodash.throttle
Throttling is another technique that limits the number of times a function can be called within a given interval. While it’s not suitable for our city filter problem, we can use Lodash’s throttle
method to implement throttling in other scenarios.
import throttle from 'lodash.throttle';
const handleScroll = throttle((event) => {
// scroll handling implementation
}, 100);
Easier Debouncing with react-debounce-input
The react-debounce-input package provides an easier way to implement input debouncing in React. We can use the DebounceInput
component, which comes with an inbuilt debounce functionality, to simplify our code and make it more maintainable.
import DebounceInput from 'eact-debounce-input';
const CityFilter = () => (
<DebounceInput
debounceTimeout={500}
onChange={(event) => {
// filter function implementation
}}
/>
);