← Articles

Afficher instantanément des données serveur avec Vue Query

Comment améliorer l’affichage de données serveur dans une app Vue.js en utilisant le cache ?

La librairie Vue Query (version de TanStack Query pour Vue.js) permet de mettre en cache facilement des données serveur et de les afficher instantanément.

Le résultat est un affichage instantané lors de la visite d'une page et pendant une mutation de données.

On utilise souvent une librairie de gestion d’état comme Pinia ou Vuex, efficace pour les données client, un peu moins pour les données serveur asynchrones.

La librairie TanStack propose les composables useQueryClient, useQuery et useMutation permettant ainsi d’afficher (à partir de la deuxième visite) et de mettre à jour les données serveur sur l’interface de façon très fluide.

useQuery : lire et mettre en cache

Un appel à useQuery avec une queryKey, une queryFn, un staleTime de 60 secondes et un refetchInterval en commentaire

Dans useQuery :

  • queryKey est un tableau qui permet d’identifier les résultats mis en cache pour cette query.
  • staleTime indique pendant combien de temps (60 sec par ex.) les données sont considérées comme « fraîches », et donc pendant combien de temps ce cache est utilisé pour l’affichage des données.
  • refetchInterval permet de relancer automatiquement la même query à intervalle régulier.

useMutation : mettre à jour et invalider

Un appel à useMutation dont le callback onSuccess invalide la query "todos" pour déclencher un re-fetch

useMutation permet de gérer les mutations des données serveur avec invalidateQueries, qui déclenche un re-fetch des données.

L’optimistic update

useMutation permet aussi un « optimistic update » : lors d'un update, on anticipe la nouvelle valeur des données serveur en éditant le cache immédiatement et en l'affichant. La query mettra à jour les données en arrière-plan une fois résolue.

Pour cela, on utilise la fonction setQueryData dans le callback onMutate.

Un appel à useMutation avec un optimistic update : onMutate ajoute le nouveau todo dans le cache via setQueryData, puis onSuccess réinitialise le formulaire et invalide la query