Skip to content

Instantly share code, notes, and snippets.

@dgtlmonk
Created January 21, 2020 09:45
Show Gist options
  • Save dgtlmonk/70002882acd86ce25ef728760babb82d to your computer and use it in GitHub Desktop.
Save dgtlmonk/70002882acd86ce25ef728760babb82d to your computer and use it in GitHub Desktop.
debounce hoooks
import React, { useState, useEffect } from 'react';
// Our hook
export default function useDebounce(value, delay) {
// State and setters for debounced value
const [debouncedValue, setDebouncedValue] = useState(value);
useEffect(
() => {
// Set debouncedValue to value (passed in) after the specified delay
const handler = setTimeout(() => {
setDebouncedValue(value);
}, delay);
// Return a cleanup function that will be called every time ...
// ... useEffect is re-called. useEffect will only be re-called ...
// ... if value changes (see the inputs array below).
// This is how we prevent debouncedValue from changing if value is ...
// ... changed within the delay period. Timeout gets cleared and restarted.
// To put it in context, if the user is typing within our app's ...
// ... search box, we don't want the debouncedValue to update until ...
// ... they've stopped typing for more than 500ms.
return () => {
clearTimeout(handler);
};
},
// Only re-call effect if value changes
// You could also add the "delay" var to inputs array if you ...
// ... need to be able to change that dynamically.
[value]
);
return debouncedValue;
}
@dgtlmonk
Copy link
Author

Usage

// App

import useDebounce from './use-debounce';

const [searchTerm, setSearchTerm] = useState('');
const debouncedSearchTerm = useDebounce(searchTerm, 500);

Input onchange > setSearchTerm(e.target.value)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment