2022 - Verwenden Sie ein useEffect-Hook
Ihre beste Option zu diesem Zeitpunkt ist die Verwendung des useEffect
-Hooks. useEffect
ermöglicht es Ihnen, eine Funktion festzulegen, die den Zustand in Reaktion auf ein asynchrones Ereignis ändern kann. Debouncing ist asynchron, daher eignet sich useEffect gut für diesen Zweck.
Wenn Sie eine Funktion aus dem Hook zurückgeben, wird die zurückgegebene Funktion aufgerufen, bevor der Hook erneut aufgerufen wird. Dadurch können Sie den vorherigen Timeout abbrechen und die Funktion effektiv debouncen.
Beispiel
Hier haben wir zwei Zustände, value
und tempValue
. Das Setzen von tempValue
löst einen useEffect
-Hook aus, der einen Timeout von 1000 ms startet, der eine Funktion aufruft, um tempValue
in value
zu kopieren.
Der Hook gibt eine Funktion zurück, die den Timer aufhebt. Wenn der Hook erneut aufgerufen wird (d. h., eine weitere Taste gedrückt wird), wird der Timeout abgebrochen und zurückgesetzt.
const DebounceDemo = () => {
const [value, setValue] = useState();
const [tempValue, setTempValue] = useState();
// Dieser Hook wird einen 1000-ms-Zeitgeber setzen, um tempValue in value zu kopieren
// Wenn der Hook erneut aufgerufen wird, wird der Timer abgebrochen
// Dies erzeugt ein Debouncing
useEffect(
() => {
// Warten Sie 1000 ms, bevor Sie den Wert von tempValue in value kopieren;
const timeout = setTimeout(() => {
setValue(tempValue);
}, 1000);
// Wenn der Hook erneut aufgerufen wird, brechen Sie den vorherigen Timeout ab
// Dadurch wird ein Debouncing anstelle einer Verzögerung erzeugt
return () => clearTimeout(timeout);
},
// Führen Sie den Hook jedes Mal aus, wenn der Benutzer eine Taste drückt
[tempValue]
)
// Hier erstellen wir eine Eingabe, um tempValue zu setzen.
// value wird 1000 ms nach dem letzten Aufruf des Hooks aktualisiert,
// d. h. nach der letzten Tastatureingabe des Benutzers.
return (
<>
setTempValue(target.value)
}
/>
{ value }
)
}