Les opinions divergent quant à savoir si l'accès aux créateurs de l'état en action est une bonne idée:
- Le créateur de Redux, Dan Abramov, estime que cela devrait être limité: "Les quelques cas d'utilisation où je pense que cela est acceptable sont pour vérifier les données mises en cache avant de faire une demande, ou pour vérifier si vous êtes authentifié (en d'autres termes, faire une répartition conditionnelle). Je pense que transmettre des données comme
state.something.items
dans un créateur d'action est définitivement un anti-modèle et est découragé car il a obscurci l'historique des modifications: s'il y a un bug et items
qu'elles sont incorrectes, il est difficile de retracer d' où viennent ces valeurs incorrectes parce qu'elles sont fait déjà partie de l'action, plutôt que d'être directement calculé par un réducteur en réponse à une action. Faites-le donc avec soin. "
- Le mainteneur actuel de Redux, Mark Erikson, dit qu'il est
getState
correct et même encouragé à l'utiliser dans les thunks - c'est pourquoi il existe . Il discute des avantages et des inconvénients de l'accès aux créateurs de l'état en action dans son article de blog Idiomatic Redux: Réflexions sur les thunks, les sagas, l'abstraction et la réutilisabilité .
Si vous trouvez que vous en avez besoin, les deux approches que vous avez suggérées conviennent. La première approche ne nécessite aucun middleware:
import store from '../store';
export const SOME_ACTION = 'SOME_ACTION';
export function someAction() {
return {
type: SOME_ACTION,
items: store.getState().otherReducer.items,
}
}
Cependant, vous pouvez voir qu'il repose sur store
un singleton exporté à partir d'un module. Nous ne le recommandons pas, car il est beaucoup plus difficile d' ajouter le rendu du serveur à votre application, car dans la plupart des cas, sur le serveur, vous souhaiterez avoir un magasin distinct par demande . Donc, bien que techniquement cette approche fonctionne, nous ne recommandons pas d'exporter un magasin à partir d'un module.
C'est pourquoi nous recommandons la deuxième approche:
export const SOME_ACTION = 'SOME_ACTION';
export function someAction() {
return (dispatch, getState) => {
const {items} = getState().otherReducer;
dispatch(anotherAction(items));
}
}
Cela nécessiterait que vous utilisiez le middleware Redux Thunk mais cela fonctionne bien à la fois sur le client et sur le serveur. Vous pouvez en savoir plus sur Redux Thunk et pourquoi c'est nécessaire dans ce cas ici .
Idéalement, vos actions ne devraient pas être «grosses» et devraient contenir le moins d'informations possible, mais vous devriez vous sentir libre de faire ce qui vous convient le mieux dans votre propre application. La FAQ Redux contient des informations sur la répartition de la logique entre les créateurs d'action et les réducteurs et les moments où il peut être utile de l'utiliser getState
dans un créateur d'action .
getState
comme deuxième paramètre, je craquais la tête, merci beaucoupLorsque votre scénario est simple, vous pouvez utiliser
Mais parfois, votre
action creator
besoin de déclencher plusieurs actionspar exemple, demande asynchrone, vous avez donc besoin d'
REQUEST_LOAD
REQUEST_LOAD_SUCCESS
REQUEST_LOAD_FAIL
actionsRemarque: vous avez besoin de redux-thunk pour retourner la fonction dans le créateur d'action
la source
loading === true
y en a et désactivez le bouton.Je suis d'accord avec @Bloomca. Passer la valeur nécessaire du magasin à la fonction de répartition comme argument semble plus simple que d'exporter le magasin. J'ai fait un exemple ici:
la source
Je voudrais souligner qu'il n'est pas si mal de lire à partir du magasin - il pourrait être beaucoup plus pratique de décider de ce qui devrait être fait en fonction du magasin, que de tout passer au composant, puis en tant que paramètre de une fonction. Je suis entièrement d'accord avec Dan, qu'il est préférable de ne pas utiliser Store comme un seul ton, à moins que vous ne soyez sûr à 100% que vous n'utiliserez que pour le rendu côté client (sinon des bogues difficiles à tracer pourraient apparaître).
J'ai récemment créé une bibliothèque pour gérer la verbosité de redux, et je pense que c'est une bonne idée de tout mettre dans le middleware, donc vous avez tout comme injection de dépendance.
Donc, votre exemple ressemblera à ça:
Cependant, comme vous pouvez le voir, nous ne modifions pas vraiment les données ici, il y a donc de fortes chances que nous puissions simplement utiliser ce sélecteur à un autre endroit pour les combiner ailleurs.
la source
Présenter une autre façon de résoudre ce problème. Cela peut être meilleur ou pire que la solution de Dan, selon votre application.
Vous pouvez obtenir l'état des réducteurs dans les actions en divisant l'action en 2 fonctions distinctes: demander d'abord les données, deuxième agir sur les données. Vous pouvez le faire en utilisant
redux-loop
.Tout d'abord «veuillez demander les données»
Dans le réducteur, interceptez la demande et fournissez les données à la deuxième étape en utilisant
redux-loop
.Avec les données en main, faites ce que vous vouliez au départ
J'espère que cela aide quelqu'un.
la source
Je sais que je suis en retard à la fête ici, mais je suis venu ici pour des opinions sur mon propre désir d'utiliser l'état dans les actions, puis j'ai formé le mien, quand j'ai réalisé ce que je pense être le bon comportement.
C'est là qu'un sélecteur a le plus de sens pour moi. Votre composant qui émet cette demande doit être informé s'il est temps de le faire via la sélection.
Cela peut ressembler à une fuite d'abstractions, mais votre composant doit clairement envoyer un message et la charge utile du message doit contenir un état pertinent. Malheureusement, votre question n'a pas d'exemple concret car nous pourrions ainsi travailler sur un «meilleur modèle» de sélecteurs et d'actions.
la source
Je voudrais suggérer une autre alternative que je trouve la plus propre, mais elle nécessite
react-redux
ou quelque chose de simulaire - j'utilise également quelques autres fonctionnalités sophistiquées en cours de route:Si vous souhaitez réutiliser ce que vous devrez extraire le spécifique
mapState
,mapDispatch
etmergeProps
en fonctions de réutiliser ailleurs, mais ce qui rend les dépendances parfaitement claires.la source