À mesure que les applications deviennent plus complexes, les développeurs avancés cherchent à mettre en place des architectures en couches pour mieux structurer leur code. Une telle approche permet non seulement de gérer la complexité, mais aussi de rendre l'application plus maintenable et évolutive. Cette évolution dans notre organisation de code doit être prise en compte de manière globale.
Gestion de la complexité
Une seule source de vérité
Portabilité et réutilisation
Redux est une bibliothèque JavaScript permettant de gérer l’état de nos données dans notre application React. Elle est aujourd’hui l’une des plus utilisées dans les applications Front End et est compatible avec différentes bibliothèques.
La gestion de l’état de nos données avec Redux s’organise en trois parties distinctes :
Pour ce faire, nous allons créer une petite application de gestion de liste de courses. Nous pouvons la résumer en U.S :
Pour commencer, retrouvez le code de base du projet avec les composants sur ce repo :
Pour implémenter Redux dans notre application React, vous aurez besoin de 2 packages : react-redux et redux toolkit (cf Documentation officielle ).
Actions
Dans un premier temps, nous allons créer une première action. (Pour rappel, une action est un événement entraînant un changement dans nos données). Par exemple, pour répondre à l’US de la mise à jour de la quantité, nommons notre action “quantity”.
Dans notre dossier Redux, ouvrons notre fichier action.js. À l’intérieur de ce fichier, nous allons lister nos actions.
Reducer
Une fois notre action mise en place, nous allons mettre en place la description (ce que doit faire notre code quand l’action est demandée) dans notre reducer (deuxième fichier nécessaire).
À l’intérieur de ce fichier, nous allons importer nos actions (une seule pour le moment) et créer, via un objet builder de la bibliothèque Redux, une liste d’actions (On peut voir ce builder comme un équivalent de switch).
La méthode createReducer accepte deux arguments :
Dans ce code, la logique pour mettre à jour la quantité est déjà mise en place dans la méthode addCase.
Store
Dernière étape, la création de notre store partageable entre nos composants. Ouvrons notre fichier store.js et ajoutons le code suivant :
Nous avons un code tout simple, mais il est possible d’envisager plusieurs logiques métiers, et donc plusieurs reducers, implémentant de nombreuses actions. Le fichier du store permet de centraliser l’ensemble de nos états de données.
Configuration
Pour rendre les données accessibles à l’ensemble de nos pages et composants de notre application, nous allons encadrer notre <App /> avec son <Provider /> (son fournisseur de données).
Félicitations 🚀 🚀 🚀
Notre système est mis en place. Vérifions-le.
Dans le fichier ToDos.jsx, importons le hook useSelector de la bibliothèque react-redux pour récupérer notre store. Supprimons notre import de données (shoppingList). Et récupérons-le maintenant depuis notre store.
Lançons notre projet avec npm run dev. Notre liste d’articles doit toujours s’afficher. Notre donnée est bien centralisée.
De la même manière, nous pouvons maintenant modifier notre Header.jsx pour afficher le nombre d’éléments actuellement à acheter. Importez le hook useSelector et gérez la logique de filtre dans votre composant.
Bravo ! Notre application est pleinement prête.
La liaison entre nos actions et l’état de notre donnée se situe dans notre fichier reducer.js. C’est notre intermédiaire, permettant une bonne séparation des préoccupations.
Regardons attentivement le code. Nous avons déjà mis en place la logique. Dans notre builder, nous ajoutons un cas applicatif (addCase). Cette méthode nécessite deux arguments :
Et maintenant, implémentons la logique dans notre composant.
Dans le fichier ToDos.jsx, il faut :
À vous de jouer :
Voici le code final :
Maintenant que notre système est mis en place, on réalise que les étapes sont toujours les mêmes :
À vous de jouer.
Retrouvez le code final de l’application ici
On réalise rapidement que le degré de complexité pour la mise en place de Redux dans React va vite être compensé dans notre quotidien par le gain de temps en ajout de fonctionnalités, maintenabilité et prévision du comportement de notre application.
Pour des applications moins complexes, la combinaison de Context API et useReducer peut être une alternative légère à Redux. Context API permet de passer des données à travers l'arborescence des composants sans avoir à passer manuellement des props à chaque niveau. useReducer, quant à lui, est un hook qui permet de gérer l'état local du composant de manière similaire à Redux, en utilisant une fonction reducer. (Notion abordée dans nos Bootcamps 5 mois)
Zustand est une autre bibliothèque légère pour la gestion d'état dans React. Elle offre une API simple et intuitive et peut être une excellente alternative pour des projets de petite à moyenne taille.
En conclusion, la gestion de l'état global dans une application React peut être réalisée de différentes manières selon la complexité du projet et les besoins spécifiques. Redux, Context API avec useReducer, et Zustand sont toutes des solutions viables offrant divers niveaux de complexité et de fonctionnalités.