Comment débouncer un champ de recherche en JavaScript ?

poze 3 months ago162 gadefr

0

Mon champ de recherche envoie une requête à chaque frappe. Pour « javascript », ça fait 10 requêtes. Comment attendre que l'utilisateur ait fini de taper ?

Dyagnostik IA

Se IA ki fè l. Se pa yon repons — kominote a anba a konfime oswa korije l. Toujou verifye anvan ou fye l.

poze 3 months ago

1 Repons

7
✓
✓ Repons yo aksepte

C'est le debounce : on repousse l'appel tant que l'utilisateur continue de taper.

function debounce(fn, delay = 300) {
  let t;
  return (...args) => {
    clearTimeout(t);
    t = setTimeout(() => fn(...args), delay);
  };
}

const search = debounce((q) => fetch(`/api/search?q=${encodeURIComponent(q)}`), 300);
input.addEventListener('input', (e) => search(e.target.value));

En React, debounce la valeur plutôt que la fonction :

function useDebounced<T>(value: T, delay = 300) {
  const [v, setV] = useState(value);
  useEffect(() => {
    const t = setTimeout(() => setV(value), delay);
    return () => clearTimeout(t);
  }, [value, delay]);
  return v;
}

Pense aussi à annuler la requête précédente avec un AbortController, pour éviter qu'une réponse lente écrase une plus récente.

Konekte pou di lòt moun si li te mache.

answered 2 months ago

Sign in and verify your email to post an answer.