L'Architecture en Microservices : Approfondissement et Schémas
Pourquoi passer d'un monolithe à une structure en microservice ?
Cet article explique comment implémenter des mises à jour optimistes avec @tanstack/react-query dans une application de liste de tâches. Découvrez la configuration, la récupération des tâches et les mutations optimistes, avec des exemples de code détaillés.
Les mises à jour optimistes sont une technique permettant d'améliorer l'expérience utilisateur dans les applications web en devançant les réponses du serveur. Plutôt que d'attendre la confirmation du serveur pour mettre à jour l'interface utilisateur, les mises à jour optimistes permettent de refléter immédiatement les changements présumés. Si le serveur confirme la modification, tout va bien. Cependant, si le serveur rejette la demande, l'interface utilisateur revient à l'état précédent.
Dans cet article, nous verrons comment implémenter des mises à jour optimistes en utilisant @tanstack/react-query, une bibliothèque populaire de gestion des requêtes en React.
Assurez-vous d'avoir une application React configurée avec @tanstack/react-query. Si ce n'est pas le cas, vous pouvez l'installer en utilisant npm ou yarn :
npm install @tanstack/react-query
# ou
yarn add @tanstack/react-query
Nous allons examiner l'exemple d'application d'une liste de tâches (To-Do List) pour illustrer les mises à jour optimistes.
Commençons par configurer React Query dans notre application :
import React from 'react';
import ReactDOM from 'react-dom';
import {
QueryClient,
QueryClientProvider
} from '@tanstack/react-query';
import App from './App';
const queryClient = new QueryClient();
ReactDOM.render(
<QueryClientProvider client={queryClient}>
<App />
</QueryClientProvider>,
document.getElementById('root')
);
Ensuite, nous allons implémenter une liste de tâches avec des fonctionnalités de mise à jour optimiste.
import axios from 'axios';
const fetchTodos = async () => {
const { data } = await axios.get('/api/todos');
return data;
};
import React from 'react';
import {
useQuery,
useMutation,
useQueryClient
} from '@tanstack/react-query';
import axios from 'axios';
const Todos = () => {
const queryClient = useQueryClient();
const { data: todos, isLoading } = useQuery(['todos'], fetchTodos);
const updateTodo = useMutation(
(updatedTodo) => axios.put(`/api/todos/${updatedTodo.id}`, updatedTodo),
{
onMutate: async (updatedTodo) => {
await queryClient.cancelQueries(['todos']);
const previousTodos = queryClient.getQueryData(['todos']);
queryClient.setQueryData(['todos'], (old) =>
old.map((todo) =>
todo.id === updatedTodo.id ? { ...todo, ...updatedTodo } : todo
)
);
return { previousTodos };
},
onError: (err, updatedTodo, context) => {
queryClient.setQueryData(['todos'], context.previousTodos);
},
onSettled: () => {
queryClient.invalidateQueries(['todos']);
},
}
);
if (isLoading) return <div>Loading...</div>;
return (
<ul>
{todos.map((todo) => (
<li key={todo.id}>
{todo.text}
<button onClick={() => updateTodo.mutate({ ...todo, completed: !todo.completed })}>
{todo.completed ? 'Undo' : 'Complete'}
</button>
</li>
))}
</ul>
);
};
export default Todos;
Les mises à jour optimistes améliorent significativement l'expérience utilisateur en rendant l'application plus réactive et en réduisant les temps de latence perçus.
N'hésitez pas à adapter ces exemples à vos propres besoins et à explorer plus en profondeur les fonctionnalités offertes par React Query.