Comment débouncer un champ de recherche en JavaScript ?

asked 3 months ago168 viewsfr

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 ?

AI diagnosis

AI-generated. Not an answer — the community below confirms or corrects it. Always verify before relying on it.

asked 3 months ago

1 Answer

7
✓
✓ Accepted answer

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.

Sign in to tell others whether this worked.

answered 3 months ago

Sign in and verify your email to post an answer.