Adloun

Vue : construire une application web (école d'ingénieur) · Chapitre 8 · Exercice de TD

Attendre la fin de la frappe

Cycle de vie et composables · niveau 3 (difficile)

Énoncé

Écrire un composable useAntiRebond(source, delai) qui rend une copie de la ref source qui ne prend sa nouvelle valeur qu'après delai millisecondes sans changement. L'utiliser pour qu'une recherche n'interroge le serveur qu'une fois quand on tape « java ».

Corrigé


import { ref, watch } from "vue";

/**
 * Une copie de `source` qui ne prend sa nouvelle valeur qu'après `delai` ms
 * sans changement (anti-rebond) : on ne recherche plus à chaque lettre.
 */
export function useAntiRebond(source, delai = 300) {
  const valeur = ref(source.value);
  watch(source, (nouvelle, ancienne, auNettoyage) => {
    const minuteur = setTimeout(() => (valeur.value = nouvelle), delai);
    auNettoyage(() => clearTimeout(minuteur)); // un nouveau changement annule l'attente
  });
  return valeur;
}

<script setup>
import { ref } from "vue";
import { useAntiRebond } from "../composables/useAntiRebond.js";
import { useFetch } from "../composables/useFetch.js";

const saisie = ref("");
const q = useAntiRebond(saisie, 300);
const { donnees: livres } = useFetch(() => `/api/livres?q=${encodeURIComponent(q.value)}`);
</script>

On tape « java » à raison d'une lettre toutes les 80 millisecondes :


requêtes après la frappe : ["?q=java"]
Programmation Java

Une seule requête part, 300 millisecondes après la dernière lettre. Le troisième paramètre du rappel d'un watch enregistre une fonction de nettoyage, appelée juste avant le rappel suivant : chaque nouvelle lettre annule l'attente de la précédente. Et si le composant disparaît pendant l'attente, Vue appelle aussi ce nettoyage.

100 % gratuit

La suite du chapitre est sur Adloun

Exercice suivant et tuteur

Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.

Le cours du chapitre · Tous les exercices du chapitre

Exercice suivant et tuteur →