Hier soir, j'ai eu le privilège de présenter un talk devant la communauté React Montréal 🙌
Le sujet : "Comment choisir une bibliothèque de gestion d'état pour vos applications React et React Native".
La gestion d'état est l'un des sujets les plus discutés dans l'écosystème React. Entre Redux, Zustand, Jotai, Recoil, Context API ou encore TanStack Query, le choix peut vite devenir déroutant — surtout quand on doit aussi penser à la compatibilité avec React Native.
Au cours de cette présentation, j'ai proposé une grille de lecture pour aider les développeurs à choisir la solution adaptée à leur contexte, en tenant compte de plusieurs critères :
Pour bien choisir, il faut comprendre d'où on vient. La gestion d'état dans React a beaucoup évolué :
setState sur les class components, le début de toutuseState, useReducer, useContext — révolution dans la façon d'écrire l'état local
Les hooks ont simplifié énormément de choses, mais ils ont leurs limites :
useReducer peut devenir verbeux et difficile à maintenir sur des gros projets
Face à ces limites, l'écosystème a répondu avec des solutions adaptées à chaque besoin :
| Bibliothèque | Approche | Idéal pour |
|---|---|---|
| Redux Toolkit | Centralisé, flux unidirectionnel | Grandes apps, équipes larges |
| Zustand | Store minimal, API simple | Apps moyennes, migration Redux |
| Jotai | Atomique, bottom-up | État granulaire, performance |
| Recoil | Atomique (Facebook) | Graphes de dépendances complexes |
| TanStack Query | État serveur uniquement | Fetching, cache, synchronisation |
| Valtio | État mutable par proxy | Simplicité, DX rapide |
Trois grandes familles se distinguent :
1. État global centralisé (Redux, Zustand) Un seul store contient tout l'état de l'app. Prévisible, facile à déboguer avec les devtools, mais peut devenir verbeux.
2. État atomique (Jotai, Recoil) L'état est découpé en "atomes" indépendants. Chaque composant ne s'abonne qu'aux atomes dont il a besoin — moins de re-renders inutiles.
3. État serveur (TanStack Query, SWR) Sépare clairement l'état client de l'état serveur. Gère automatiquement le cache, la revalidation et les états de chargement/erreur.
Les Signals sont un nouveau primitif réactif en cours de standardisation dans JavaScript lui-même. Inspirés par SolidJS, Angular Signals et Preact Signals, ils permettent une réactivité fine-grained — seules les parties de l'UI qui dépendent d'une valeur se mettent à jour, sans re-render du composant entier.
// Concept simplifié
const count = new Signal(0)
count.value++ // seuls les abonnés directs se mettent à jourSi cette proposition passe, la gestion d'état pourrait changer fondamentalement — non plus au niveau des frameworks, mais au niveau du langage. À surveiller de très près ! 👀
Ce qui m'a le plus marqué lors de cette soirée, c'est l'énergie et l'engagement de la communauté. Les questions posées après le talk étaient pertinentes, les échanges riches, et j'ai pu avoir des discussions passionnantes avec des développeurs de tous niveaux.
Un immense merci à Zenika Canada pour l'accueil et le soutien — ces événements ne seraient pas possibles sans eux. 🙏
La présentation est disponible en replay sur YouTube. N'hésitez pas à la regarder et à partager vos retours !