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
- 9 autres exercices corrigés dans ce chapitre
- Les 2 QCM du chapitre, le premier sans compte
- Le tuteur, qui guide pas à pas sans donner la réponse
Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.