J'ai un réducteur pour les clients, un autre pour AppToolbar et quelques autres ...
Disons maintenant que j'ai créé une action de récupération pour supprimer le client, et si cela échoue, j'ai du code dans le réducteur de clients qui devrait faire certaines choses, mais je veux aussi afficher une erreur globale dans AppToolbar.
Mais les clients et les réducteurs AppToolbar ne partagent pas la même partie de l'état et je ne peux pas créer une nouvelle action dans le réducteur.
Alors, comment suis-je supposé montrer une erreur globale? Merci
MISE À JOUR 1:
J'oublie de mentionner que j'utilise este devstack
MISE À JOUR 2: J'ai marqué la réponse d'Eric comme correcte, mais je dois dire que la solution que j'utilise en este ressemble plus à une combinaison de la réponse d'Eric et de Dan ... Il vous suffit de trouver ce qui vous convient le mieux dans votre code. .
la source
Réponses:
Si vous voulez avoir le concept d '"erreurs globales", vous pouvez créer un
errors
réducteur, qui peut écouter les actions addError, removeError, etc .... Ensuite, vous pouvez vous connecter à votre arborescence d'états Redux surstate.errors
et les afficher le cas échéant.Vous pouvez aborder cela de plusieurs manières, mais l'idée générale est que les erreurs / messages globaux mériteraient que leur propre réducteur soit complètement séparé de
<Clients />
/<AppToolbar />
. Bien sûr, si l'un de ces composants a besoin d'accès,errors
vous pouvez les transmettreerrors
en tant qu'accessoire là où c'est nécessaire.Mise à jour: exemple de code
Voici un exemple de ce à quoi cela pourrait ressembler si vous deviez passer les "erreurs globales"
errors
dans votre niveau supérieur<App />
et les restituer conditionnellement (s'il y a des erreurs présentes). Utilisation de react-reduxconnect
pour connecter votre<App />
composant à certaines données.Et en ce qui concerne le créateur d'action, il enverrait ( redux-thunk ) échec de succès en fonction de la réponse
Alors que votre réducteur pourrait simplement gérer un tableau d'erreurs, en ajoutant / supprimant des entrées de manière appropriée.
la source
catch
fonctions appelées sisomeHttpClient.get('/resources')
oufetch('/resources')
que j'utilise dans mon code return500 Server Error
. Avez-vous des pensées sur lesquelles je pourrais faire une erreur? Essentiellement, ce que je fais est d'fetch
envoyer une demande qui se termine par monroutes
dans lequel j'appelle une méthode sur monmongoose
modèle pour faire quelque chose de très simple, comme ajouter un texte ou supprimer un texte de DB.La réponse d'Erik est correcte mais je voudrais ajouter que vous n'avez pas à déclencher des actions séparées pour ajouter des erreurs. Une approche alternative consiste à avoir un réducteur qui gère toute action avec un
error
champ . C'est une question de choix personnel et de convention.Par exemple, à partir de l' exemple Redux
real-world
qui a une gestion des erreurs:la source
error
à la charge utile de l'action. Merci Dan!L'approche que je prends actuellement pour quelques erreurs spécifiques (validation d'entrée utilisateur) consiste à demander à mes sous-réducteurs de lancer une exception, de l'attraper dans mon réducteur racine et de l'attacher à l'objet d'action. Ensuite, j'ai un redux-saga qui inspecte les objets d'action pour une erreur et met à jour l'arborescence d'état avec des données d'erreur dans ce cas.
Alors:
Et puis ajouter l'erreur à l'arborescence d'état est comme Erik le décrit.
Je l'utilise avec parcimonie, mais cela m'évite d'avoir à dupliquer la logique qui appartient légitimement au réducteur (afin qu'il puisse se protéger d'un état invalide).
la source
écrire un middleware personnalisé pour gérer toutes les erreurs liées à l'API. Dans ce cas, votre code sera plus propre.
la source
if
dans un réducteurce que je fais est de centraliser toute la gestion des erreurs dans l'effet sur une base par effet
la source
Vous pouvez utiliser le client HTTP axios. Il a déjà implémenté la fonction Intercepteurs. Vous pouvez intercepter les demandes ou les réponses avant qu'elles ne soient traitées d'ici là ou catch.
https://github.com/mzabriskie/axios#interceptors
la source