⊗jsrxPmRDARR 32 of 57 menu

Ajouter un réducteur à une application Redux

Dans la leçon précédente, nous avons créé un composant UserReaction afin que chaque produit ait également des réactions utilisateurs. Maintenant, nous devons écrire un réducteur qui gérera le compteur de réactions lorsqu'un utilisateur cliquera sur le bouton de l'une ou l'autre réaction.

Ouvrons notre application avec les produits, et dans celle-ci le fichier productsSlice.js contenant tous les réducteurs. Maintenant, dans la propriété reducers créons un autre réducteur reactionClicked (nous pouvons le placer en premier - avant productAdded, bien que cela n'ait pas d'importance). Comme d'habitude, passons-lui en paramètres state et action :

reactionClicked(state, action) {},

Et maintenant, à l'intérieur des accolades que nous avons laissées vides à l'étape précédente, écrivons son code. Tout d'abord, nous extrairons l'id du produit de payload de l'objet action et le nom de la réaction :

const { productId, reaction } = action.payload

Ensuite, à partir de l'état (state) transmis, obtenons le produit concerné :

const currentProduct = state.find(product => product.id === productId)

Et si un tel produit existe, alors augmentons la valeur de la réaction transmise de 1 :

if (currentProduct) { currentProduct.reactions[reaction]++ }

Voilà, notre code pour reactionClicked est prêt :

reactionClicked(state, action) { const { productId, reaction } = action.payload const currentProduct = state.find(product => product.id === productId) if (currentProduct) { currentProduct.reactions[reaction]++ } },

Ajoutons à la fin du fichier l'exportation de l'action creator obtenu :

export const { reactionClicked, productAdded, productUpdated } = productsSlice.actions

Il est nécessaire de noter ici deux points importants. Comme vous vous en souvenez des leçons précédentes - mettre à jour directement la valeur de cette manière dans le code du réducteur est interdit (regardez cette ligne : reactions[reaction]++), mais nous pouvons nous le permettre, parce que nous le faisons à l'intérieur de createSlice, qui utilise la bibliothèque Immer. Celle-ci se chargera de transformer notre code en une mise à jour "sécurisée" de la valeur. Cela nous permet d'écrire des choses complexes de manière plus simple.

La prochaine chose à retenir - l'objet action doit contenir le minimum d'informations nécessaire - seulement pour indiquer ce qui s'est passé. Il ne faut pas y faire de calculs. Tous les calculs pour mettre à jour l'état (state) doivent être faits dans le réducteur, on peut y écrire autant de logique que nécessaire pour cela.

Ouvrez votre application avec les étudiants et dans le fichier studentsSlice.js ajoutez un autre réducteur voteClicked dans le champ reducers, comme montré dans la leçon. Écrivez le code pour celui-ci. La tâche de votre réducteur - lors d'un clic, augmenter la valeur de vote (ou du vote) sur lequel on a cliqué, pour cet étudiant, de 1.

À la fin du fichier, n'oubliez pas d'exporter l'action creator obtenu voteClicked.

kkiteskaen