Stand Juni 2021 können Sie einfach die Lösung von xnimorz implementieren: use-debounce
import { useState, useEffect, useRef } from "react";
// Verwendung
function App() {
// Zustand und Setter für ...
// Suchbegriff
const [searchTerm, setSearchTerm] = useState("");
// API Suchergebnisse
const [results, setResults] = useState([]);
// Suchstatus (ob eine ausstehende API-Anfrage vorliegt)
const [isSearching, setIsSearching] = useState(false);
// Verzögerung des Suchbegriffs, damit nur der neueste Wert geliefert wird ...
// ... wenn der Suchbegriff in den letzten 500 ms nicht aktualisiert wurde.
// Das Ziel ist es, den API-Aufruf nur auszulösen, wenn der Benutzer aufhört zu tippen ...
// ... damit wir unsere API nicht zu schnell abfragen.
const debouncedSearchTerm = useDebounce(searchTerm, 500);
// Effekt für API-Aufruf
useEffect(
() => {
if (debouncedSearchTerm) {
setIsSearching(true);
searchCharacters(debouncedSearchTerm).then((results) => {
setIsSearching(false);
setResults(results);
});
} else {
setResults([]);
setIsSearching(false);
}
},
[debouncedSearchTerm] // Effekt nur aufrufen, wenn sich der verzögerte Suchbegriff ändert
);
return (
setSearchTerm(e.target.value)}
/>
{isSearching && Suche ...}
{results.map((result) => (
{result.title}
))}
);
}
// API Suchfunktion
function searchCharacters(search) {
const apiKey = "f9dfb1e8d466d36c27850bedd2047687";
return fetch(
`https://gateway.marvel.com/v1/public/comics?apikey=${apiKey}&titleStartsWith=${search}`,
{
method: "GET",
}
)
.then((r) => r.json())
.then((r) => r.data.results)
.catch((error) => {
console.error(error);
return [];
});
}
// Hook
function useDebounce(value, delay) {
// Zustand und Setter für den verzögerten Wert
const [debouncedValue, setDebouncedValue] = useState(value);
useEffect(
() => {
// Verzögerten Wert nach Verzögerung aktualisieren
const handler = setTimeout(() => {
setDebouncedValue(value);
}, delay);
// Timeout abbrechen, wenn der Wert geändert wird (auch bei Änderung der Verzögerung oder Demontage)
// So verhindern wir, dass der verzögerte Wert aktualisiert wird, wenn der Wert geändert wird ...
// .. innerhalb des Verzögerungszeitraums. Timeout wird gelöscht und neu gestartet.
return () => {
clearTimeout(handler);
};
},
[value, delay] // Effekt nur erneut aufrufen, wenn sich Wert oder Verzögerung ändern
);
return debouncedValue;
}