<div id="root"></div>
function useDebouncedEffect(
  callback,
  dependency,
  timeout = 2000,
  options = { trailing: true, leading: false }
) {
  const { leading, trailing } = options;
  // the source of truth will be _dependencyRef.current  always
  const [_dependency, _setdependency] = React.useState(dependency);

  // making use of second approach here we discussed above
  const makeChangeTodependency = React.useCallback(
    _.debounce(
      dependency => {
        console.log("runnign makeChangeTodependency", dependency);
        _setdependency(dependency);
      },
      timeout,
      { trailing, leading }
    ),
    [trailing, leading, timeout]
  );

  React.useEffect(() => {
    if (dependency) {
      makeChangeTodependency(dependency);
    }
  }, dependency);

  React.useEffect(callback, _dependency);
}
function ChildComponent({ value, onChange }) {
  
  function makeApiCallRaw(value) {
    console.log("make api call with value", value);
  }

  useDebouncedEffect(
    () => {
       makeApiCallRaw(value);
    },
    [value],
    2000
  );
  
  useDebouncedEffect(
    () => {
      console.log("Hola !!");
    },
    [value],
    3000
  );

  useDebouncedEffect(
    () => {
      console.log("cool !!");
    },
    [value],
    5000
  );
  

  return (
    <input
      defaultValue={value}
      value={value}
      onChange={e => {
        onChange(e.target.value); // non debounced
        // makeApiCall(e.target.value) // debounced
      }}
    />
  );
}

function App() {
  const [value, setValue] = React.useState("");
  return (
    <div>
      Hello World
      <ChildComponent value={value} onChange={setValue} />
    </div>
  );
}

ReactDOM.render(<App />, document.getElementById("root"));
View Compiled
Run Pen

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

  1. https://cdnjs.cloudflare.com/ajax/libs/react/16.12.0/umd/react.production.min.js
  2. https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.11.0/umd/react-dom.production.min.js
  3. https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js