Dans mon application react/redux, je souhaite souvent envoyer plusieurs actions les unes après les autres.
Dans l'exemple suivant: Après une connexion réussie, je souhaite stocker les données de l'utilisateur et après celui-ci, je souhaite lancer une autre action asynchrone qui charge la configuration de l'application à partir du serveur.
Je sais que je peux utiliser redux-thunk
pour créer un créateur d'action comme celui-ci.
function loginRequestSuccess(data) {
return function(dispatch) {
dispatch(saveUserData(data.user))
dispatch(loadConfig())
}
}
Donc mes questions sont:
dispatch
retourne, l’état est-il déjà modifié par tous les réducteurs à l’écoute de cette action? Je me demande si les deux appels de dispatch sont gérés de manière strictement séquentielle.Merci pour toute aide!
Oui, redux-thunk vous permet de faire ce que vous dites, et oui, il s'agit d'une pratique recommandée pour l'envoi de plusieurs actions (une que je préfère par rapport aux alternatives en raison de sa simplicité). L’état est en effet mis à jour dès que vous envoyez (au moment où il retourne), c’est pourquoi on vous attribue une fonction permettant de récupérer l’état dans un thunk, au lieu d’une simple référence à l’état. De cette façon, vous pouvez modifier l'état avec une seule répartition, puis appeler getState () pour obtenir une référence au nouvel état, à lire si vous en avez besoin.
redux-thunk
est exactement ce que vous recherchez. Je considère que c'est une très bonne pratique.
Pour répondre à votre question, lorsque le premier envoi retourne, l'état est déjà modifié par les réducteurs appelés.
Je sais que c'est une réponse tardive :-P Vous pouvez le faire en utilisant Redux-Thunk et aussi en allant sur Redux-Saga. Redux Saga offre un moyen incroyable de gérer plusieurs actions en même temps. Vous trouverez ci-dessous un exemple d'envoi de plusieurs actions à l'aide de Redux-Thunk.
function getAndLoadSider(moduleName){
return function(dispatch){
return doSomeApiCall(someData).then(function(item){
let _item = someOtherFunction(item.collections);
let _menuData = {
name: item.name,
key: item.key
};
return new Promise(function(res, rej){
dispatch(actionOne(_menuData));
res(_item);
}).then((_item) => dispatch(actionTwo(_item)))
}
}
La méthode ci-dessus fonctionne bien pour votre cas lorsqu'une action dépend de la première. C'est une approche basée sur des promesses. Si vous n'aimez pas faire beaucoup de codage Promise, je vous recommande de choisir Sagas. Consultez ce lien https://redux-saga.js.org/docs/advanced/ComposingSagas.html où vous apprendrez à composer des sagas. Courbe d'apprentissage est raide; mais une fois que vous avez terminé, Sagas vous fera devenir un ninja redux dev.
J'espère que cela t'aides :-)