Created
January 21, 2020 09:45
-
-
Save dgtlmonk/70002882acd86ce25ef728760babb82d to your computer and use it in GitHub Desktop.
debounce hoooks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Usage
// App
import useDebounce from './use-debounce';
const [searchTerm, setSearchTerm] = useState('');
const debouncedSearchTerm = useDebounce(searchTerm, 500);
Input onchange > setSearchTerm(e.target.value)