Gestion d'État
Gestion des données globales
10-15 min
La Gestion d’État en React
La gestion d’état est un aspect crucial des applications React. Nous allons explorer différentes approches pour gérer l’état global de votre application.
Context API
Création d’un contexte
import { createContext, useContext, useState } from 'react';
const ThemeContext = createContext();
function ThemeProvider({ children }) {
const [theme, setTheme] = useState('light');
return (
<ThemeContext.Provider value={{ theme, setTheme }}>
{children}
</ThemeContext.Provider>
);
}
// Hook personnalisé pour utiliser le contexte
function useTheme() {
const context = useContext(ThemeContext);
if (!context) {
throw new Error('useTheme doit être utilisé dans un ThemeProvider');
}
return context;
}
Utilisation du contexte
function App() {
return (
<ThemeProvider>
<Navigation />
<MainContent />
</ThemeProvider>
);
}
function ThemeToggle() {
const { theme, setTheme } = useTheme();
return (
<button onClick={() => setTheme(theme === 'light' ? 'dark' : 'light')}>
Changer le thème
</button>
);
}
Redux Toolkit
Installation
npm install @reduxjs/toolkit react-redux
Configuration du store
import { configureStore, createSlice } from '@reduxjs/toolkit';
const counterSlice = createSlice({
name: 'counter',
initialState: { value: 0 },
reducers: {
increment: (state) => {
state.value += 1;
},
decrement: (state) => {
state.value -= 1;
},
},
});
const store = configureStore({
reducer: {
counter: counterSlice.reducer,
},
});
export const { increment, decrement } = counterSlice.actions;
export default store;
Utilisation de Redux
import { Provider, useSelector, useDispatch } from 'react-redux';
import { increment, decrement } from './store';
function App() {
return (
<Provider store={store}>
<Counter />
</Provider>
);
}
function Counter() {
const count = useSelector((state) => state.counter.value);
const dispatch = useDispatch();
return (
<div>
<button onClick={() => dispatch(decrement())}>-</button>
<span>{count}</span>
<button onClick={() => dispatch(increment())}>+</button>
</div>
);
}
Zustand
Installation
npm install zustand
Création d’un store
import create from 'zustand';
const useStore = create((set) => ({
bears: 0,
increasePopulation: () => set((state) => ({ bears: state.bears + 1 })),
removeAllBears: () => set({ bears: 0 }),
}));
function BearCounter() {
const bears = useStore((state) => state.bears);
const increasePopulation = useStore((state) => state.increasePopulation);
return (
<div>
<h1>{bears} ours</h1>
<button onClick={increasePopulation}>Ajouter un ours</button>
</div>
);
}
Recoil
Installation
npm install recoil
Configuration et utilisation
import { RecoilRoot, atom, useRecoilState } from 'recoil';
const counterState = atom({
key: 'counterState',
default: 0,
});
function App() {
return (
<RecoilRoot>
<Counter />
</RecoilRoot>
);
}
function Counter() {
const [count, setCount] = useRecoilState(counterState);
return (
<div>
<button onClick={() => setCount(count - 1)}>-</button>
<span>{count}</span>
<button onClick={() => setCount(count + 1)}>+</button>
</div>
);
}
Choisir la bonne solution
Context API
- Avantages :
- Intégré à React
- Simple à mettre en place
- Parfait pour des états simples
- Inconvénients :
- Peut causer des re-rendus inutiles
- Pas optimisé pour les mises à jour fréquentes
Redux
- Avantages :
- Écosystème mature
- Outils de développement puissants
- Bon pour les applications complexes
- Inconvénients :
- Configuration initiale complexe
- Beaucoup de boilerplate
- Peut être excessif pour des applications simples
Zustand
- Avantages :
- API simple et intuitive
- Performance optimale
- Bundle size minimal
- Inconvénients :
- Communauté plus petite
- Moins d’outils de développement
Recoil
- Avantages :
- API atomique
- Performance optimale
- Intégration avec React
- Inconvénients :
- Encore en développement
- Moins mature que Redux
Bonnes Pratiques
-
Choix de la solution :
- Commencez avec Context API pour des états simples
- Utilisez Redux pour des applications complexes
- Considérez Zustand pour des performances optimales
- Explorez Recoil pour des applications modernes
-
Organisation :
- Séparez la logique d’état
- Utilisez des hooks personnalisés
- Maintenez une structure claire
-
Performance :
- Évitez les re-rendus inutiles
- Utilisez la sélection sélective
- Optimisez les mises à jour
Exercices pratiques
-
Créez une application de panier avec :
- Gestion des produits
- Calcul du total
- Persistance des données
- Historique des commandes
-
Créez un tableau de bord avec :
- Filtres dynamiques
- Statistiques en temps réel
- Préférences utilisateur
- Thèmes personnalisés
-
Créez une application de chat avec :
- Messages en temps réel
- État de connexion
- Notifications
- Historique des conversations
Conclusion
La gestion d’état est un aspect crucial des applications React. Dans le prochain chapitre, nous allons explorer les tests en React, qui permettent de garantir la qualité et la maintenabilité de votre code.
Commentaires
Les commentaires sont alimentés par GitHub Discussions
Connectez-vous avec GitHub pour participer à la discussion