- Redux centralise et contrôle l'état de votre application avec des règles claires et prévisibles.
- Permet un débogage avancé, une évolutivité et une architecture robuste pour les grands projets
- Son écosystème facilite les intégrations avec React, d'autres frameworks et outils de développement

Redux est l’un des noms les plus fréquemment mentionnés lorsqu’il s’agit de gestion d’état dans les applications JavaScript modernes. Bien que de nombreuses personnes l'associent directement à l'écosystème React, la réalité est que Redux peut fonctionner parfaitement avec n'importe quel framework ou même dans des projets JavaScript purs grâce à sa philosophie agnostique et simple.
Comprendre Redux et savoir quand, comment et pourquoi l’utiliser peut faire la différence entre une application chaotique et une application maintenable, robuste et facile à déboguer. Si vous avez entendu parler de Flux, des réducteurs, des actions ou de la redoutable « gestion d'état », nous décomposons ici tout ce que vous devez savoir, en combinant le meilleur de la documentation, des expériences de la communauté et des études de cas, mais expliqué avec des mots clairs et des exemples nouveaux.
Qu'est-ce que Redux et pourquoi existe-t-il ?

Redux est une bibliothèque JavaScript conçue pour gérer l'état des applications de manière centralisée et prévisible. Il est basé sur des concepts de programmation fonctionnelle tels que l'immuabilité et l'utilisation de fonctions pures, cherchant à rendre tout changement survenant dans l'application facile à comprendre, à suivre et à déboguer.
Il a été créé en 2015 par Dan Abramov et Andrew Clark, inspirés par Flux (de Facebook) et Elm, dans le but de simplifier la gestion globale de l'état et d'éviter les maux de tête liés au partage de données entre les composants dans des applications de plus en plus grandes et complexes.
Redux est devenu extrêmement populaire grâce à React, mais son architecture ne dépend pas obligatoirement de React, d'où sa classification comme « indépendante du framework ». Il peut être utilisé avec Angular, Vue, Svelte, ou sans framework, dans des projets JavaScript classiques.
Quel problème Redux résout-il ?
Dans toute application front-end, Le concept d'« état » représente toutes les données (variables, valeurs, indicateurs, réponses API, routes actives, sélecteurs, etc.) nécessaires au bon fonctionnement de l'interface à tout moment. Dans les petites applications, la gestion de cet état ne pose généralement pas de problème, car elle est généralement limitée aux variables locales de chaque composant ou widget. Cependant, Lorsque votre application se développe et que vous commencez à avoir besoin que différentes parties de l'application partagent ou dépendent d'informations communes, la gestion de l'état devient rapidement compliquée. avec des forages d'hélice, des états en double et une logique imprévisible.
Dans ces scénarios, un système devient nécessaire qui :
- Centraliser tous les statuts pertinents dans un lieu unique et accessible.
- Définissez des règles claires sur la manière et le moment où ce statut peut être modifié., évitant les mises à jour accidentelles.
- Suivez facilement les actions qui ont provoqué chaque changement, contribuant à affiner et à comprendre l’évolution de l’État.
- Faciliter l'extension et la maintenance des applications, vous permettant d'ajouter de nouvelles fonctionnalités sans craindre de briser les dépendances cachées.
Redux naît précisément pour couvrir ces besoins, en imposant une architecture robuste et simple où l'état est « la seule source de vérité » et ne peut être modifié que de manière bien définie et prévisible.
Les trois principes clés de Redux
- L'état global est contenu dans un seul objet appelé store : Tout ce dont votre application a besoin doit être présent. Aucun état dispersé entre les composants ne risque d'être désynchronisé.
- Le statut ne peut être modifié qu'en émettant des actions : Personne ne peut modifier directement l'état. Seules les actions qui le décrivent sont déclenchées. que s'est-il passé et, éventuellement, fournir des données supplémentaires (charge utile).
- Les changements d’état sont effectués via des fonctions pures appelées réducteurs : Ces fonctions reçoivent l'état précédent et une action, puis renvoient le nouvel état. Elles ne doivent pas avoir d'effets secondaires ni modifier l'état initial, mais plutôt renvoyer un nouvel état avec les modifications.
Structure de base de Redux : son fonctionnement
Le cycle de vie des données dans Redux suit un flux unidirectionnel extrêmement prévisible :
- Un composant ou un processus frontal (par exemple, cliquer, taper, recevoir une requête API, etc.) lance une action, qui est simplement un objet avec au moins une propriété type et, éventuellement, un charge utile extra avec des données pertinentes.
- L'action se déplace jusqu'au magasin, qui le livre avec l'état actuel aux réducteurs.
- Les réducteurs calculent le nouvel état en fonction de l'ancien état et de l'action reçue, renvoyant TOUJOURS un nouvel objet (sans jamais modifier le précédent).
- Le magasin met à jour l'état et notifie tous les composants abonnés., qui peut ensuite être réaffiché avec les nouvelles données.
Ce flux simple permet des fonctionnalités avancées telles que le voyage dans le temps, la reproduction exacte des erreurs basée sur les historiques d'actions et le débogage pratiquement automatique.
Exemple visuel et de code
Imaginez une application permettant à l'utilisateur d'ajouter et de soustraire des données à un compteur. Il pourrait y avoir des actions. { type: 'INCREMENTAR', payload: 1 } y { type: 'DECREMENTAR', payload: 1 }Un réducteur typique serait :
function contadorReducer(state = { valor: 0 }, action) {
switch(action.type) {
case 'INCREMENTAR':
return { ...state, valor: state.valor + action.payload };
case 'DECREMENTAR':
return { ...state, valor: state.valor - action.payload };
default:
return state;
}
}
Quel que soit le cadre que vous utilisez, la philosophie est toujours la même.
Éléments fondamentaux de Redux
-
- Boutique: C'est l'objet central. Il n'existe qu'un seul objet, et il contient tout l'état de l'application. Il expose des méthodes comme
getState()(renvoie l'état actuel),dispatch(action)(lance une action), etsubscribe(listener)(permet d'exécuter une fonction à chaque changement d'état). Les bibliothèques JavaScript les plus pertinentes peut être utile pour étendre ses fonctionnalités. - Actions: Objets plats. Ils ont toujours une propriété type (chaîne) et peut transporter des données supplémentaires sous charge utile ou d'autres domaines.
- Créateurs d'action : Fonctions qui génèrent des actions. Elles permettent d'éviter les erreurs et d'assurer la cohérence. Exemple :
- Boutique: C'est l'objet central. Il n'existe qu'un seul objet, et il contient tout l'état de l'application. Il expose des méthodes comme
function incrementar(valor) {
return { type: 'INCREMENTAR', payload: valor };
}
- Réducteurs: Fonctions pures. Elles reçoivent un état et une action, et renvoient l'état résultant. Elles ne doivent jamais modifier directement l'état ou l'action reçue.
- Intergiciel : Ce sont des « éléments intermédiaires » qui s'insèrent entre le déclenchement de l'action et son exécution par le réducteur. Ils sont idéaux pour la journalisation, les appels d'API, la gestion des erreurs ou les effets secondaires asynchrones. Parmi les exemples les plus connus, on peut citer :
redux-thunkyredux-saga. Cadres JavaScript liés facilitent leur intégration.
Pourquoi choisir Redux et dans quels scénarios excelle-t-il ?
La plus grande force de Redux est de fournir un contrôle et une clarté sur le flux de données dans les grandes applications. Si vous n'avez que quelques composants, les états locaux ou l'API Context de React suffiront probablement. Cependant, si votre projet nécessite :
- Communication fréquente entre des parties distantes de l'interface (par exemple, une barre d'utilisateur qui doit refléter les modifications effectuées depuis n'importe quel coin de l'application).
- Reproduction exacte des erreurs et débogage avancé.
- Prise en charge des outils de développement tels que Redux DevTools, qui permettent d'analyser en temps réel l'historique des actions et des changements de statut.
- Gestion organisée des flux asynchrones (requêtes vers les serveurs, websockets, etc.).
Ainsi, Redux peut vous éviter d’innombrables frustrations.
Pas seulement pour React !
L'intégration avec d'autres frameworks se fait soit directement, soit via des adaptateurs. Angular, Vue, Ember, Svelte… tous peuvent bénéficier de Redux pour centraliser l'état si nécessaire. De plus, il existe des utilitaires tels que redux-immutable o redux-duck qui facilitent la modularité et l'intégration avec des collections immuables. Ils couvrent également ces aspects.
Redux ou useReducer/Context ?
Depuis l'introduction de React Crochets, de nombreux développeurs se demandent si utiliserRéducteur avec Context API, ce n'est pas suffisant. Dans les applications simples, c'est suffisant. Mais à mesure que l’état partagé devient plus important, les avantages de Redux deviennent évidents : outils de débogage, modularité, middleware, écosystème mature et modèles bien étudiés.
La structure d'un projet Redux : bonnes pratiques
Une structure claire est essentielle pour les grands projets. Il est souvent recommandé de séparer les dossiers pour :
- actes/ (partager les créateurs, les types…)
- réducteurs/
- boutique/
- composants / (présentationnel, sans lien direct avec Redux)
- conteneurs/ (composants connectés à Redux, responsables de la transmission des données et des actions aux composants de présentation)
De plus, le modèle Ducks vous permet de regrouper les réducteurs, les actions et les types associés dans un seul fichier par fonctionnalité, ce qui peut faciliter la maintenance entre plusieurs équipes.
Travailler avec des middlewares et des actions asynchrones
La vie réelle n’est pas synchrone : vous devez charger des données, interagir avec des API et gérer les erreurs. C'est là qu'interviennent les intergiciels. Deux des plus populaires sont :
- réflexion redux : Permet de répartir des fonctions asynchrones et de répartir des actions lorsque la requête est terminée.
- saga redux : Vous permet de décrire des flux d'effets secondaires complexes de manière plus déclarative à l'aide de générateurs.
Grâce à eux, vous pouvez, par exemple, lancer une requête vers une API, attendre sa réponse, puis mettre à jour le magasin avec les données reçues ou en cas d'erreur. Vous intégrez ainsi la logique métier au cycle Redux.
Test et débogage dans Redux
Grâce à l'utilisation de fonctions pures et d'objets plats, Redux est particulièrement adapté aux tests unitaires. Tester un réducteur ou un créateur d'actions est simple : vous leur fournissez des entrées connues et vous devriez obtenir des résultats prévisibles. Les intergiciels peuvent nécessiter des tests plus élaborés, mais leur conception les simplifie également.
D'autre part, Redux DevTools offre une expérience de débogage inégalée : vous pouvez reculer ou avancer dans toutes les actions déclenchées, voir l'état exact à tout moment et même « reproduire » des bugs en fonction d'un historique d'actions enregistré.
Exemple pratique : une application simple de tâches à faire
Pour voir Redux en action, voici un exemple extrêmement simplifié (sans framework) de la façon de créer la logique d'une liste de tâches :
import { createStore } from 'redux';
// Estado inicial
const estadoInicial = { tareas: [] };
// Reducer
function tareasReducer(state = estadoInicial, action) {
switch(action.type) {
case 'ANADIR_TAREA':
return { ...state, tareas: };
case 'ELIMINAR_TAREA':
return { ...state, tareas: state.tareas.filter(t => t.id !== action.payload) };
default:
return state;
}
}
// Store
const store = createStore(tareasReducer);
// Action creators
function anadirTarea(texto) {
return { type: 'ANADIR_TAREA', payload: { id: Date.now(), texto } };
}
function eliminarTarea(id) {
return { type: 'ELIMINAR_TAREA', payload: id };
}
// Suscripción
store.subscribe(() => {
console.log('Tareas actuales:', store.getState().tareas);
});
// Despachamos algunas acciones
store.dispatch(anadirTarea('Aprender Redux'));
store.dispatch(anadirTarea('Dominar JavaScript'));
store.dispatch(eliminarTarea(store.getState().tareas.id));
Cela démontre la simplicité de l’architecture et la prévisibilité avec laquelle il est possible d’intervenir dans le flux de données, même sans aucun cadre autour.
Intégration avec React : React-Redux

Pour travailler avec Redux dans les applications React, il est courant d'utiliser réagir-redux, un package qui fournit le composant Provider (pour injecter le magasin dans l'arbre entier) et les crochets useSelector y useDispatch pour accéder à l'état et répartir les actions à partir de n'importe quel composant fonctionnel.
Cela évite de coupler manuellement le magasin et simplifie grandement le code, facilitant la séparation des composants de présentation (sans logique de magasin) des conteneurs (connectés à Redux).
Table des matières
- Qu'est-ce que Redux et pourquoi existe-t-il ?
- Quel problème Redux résout-il ?
- Les trois principes clés de Redux
- Structure de base de Redux : son fonctionnement
- Éléments fondamentaux de Redux
- Pourquoi choisir Redux et dans quels scénarios excelle-t-il ?
- Pas seulement pour React !
- Redux ou useReducer/Context ?
- La structure d'un projet Redux : bonnes pratiques
- Travailler avec des middlewares et des actions asynchrones
- Test et débogage dans Redux
- Exemple pratique : une application simple de tâches à faire
- Intégration avec React : React-Redux