How to Debounce a Function in React.js

Published Feb 19, 2022  ∙  Updated May 2, 2022

How can we debounce function calls in React.js?

We can easily use a debounce function from lodash or our own.

1. Install lodash.debounce

First, let’s install debounce from lodash (not the entire library).

npm install lodash.debounce --save

2. Use debounce from input’s onChange() handler

We can import debounce and use it to trigger a function after a certain number of milliseconds (1000ms in this code).

import debounce from "lodash.debounce";
const SomeComponent = () => {
  const [value, setValue] = useState("");
  const someApiCall = debounce((value) => {
    // Debounced
  }, 1000);
  return <>
    <input
      value={value}
      onChange={(e) => {
        someApiCall(e.target.value);
        setValue(e.target.value);
      }}
    />
  </>

2.1 Debounce leading option

By default, debounce triggers the function at the end of the interval.

So if we call someApiCall() three times in 1000ms, then it will trigger the final function call.

someApiCall('a');
someApiCall('b');
someApiCall('c'); // 'c'

We can tell this debounce function to trigger at the beginning of the interval using the leading flag. This means the function is executed immediately, but not again until the delay has passed.

someApiCall('a');
someApiCall('b');
someApiCall('c'); // 'a'

In lodash, it can be specified in the third parameter.

const someApiCall = debounce((value) => {
  // Debounced
}, 1000, { leading: true });

3. Our own debounce function

If we don’t want to use lodash, we can write our own debounce function.

function debounce(func, wait) {
  let timeout;
  return function() {
    const context = this;
    const args = arguments;
    const later = function() {
      timeout = null;
      func.apply(context, args);
    };
    clearTimeout(timeout);
    timeout = setTimeout(later, wait);
  };
};