J'ai une action async , qui récupère les données de l'API REST:
export const list = (top, skip) => dispatch => {
dispatch({ type: 'LIST.REQUEST' });
$.get(API_URL, { top: top, skip: skip })
.done((data, testStatus, jqXHR) => {
dispatch({ type: 'LIST.SUCCESS', data: data });
});
};
A sync action, qui change l'état skip
:
export const setSkip = (skip) => {
return {
type: 'LIST.SET_SKIP',
skip: skip
};
};
Etat initial pour top = 10, skip = 0
. En composant:
class List extends Component {
componentDidMount() {
this.list();
}
nextPage() {
let top = this.props.list.top;
let skip = this.props.list.skip;
// After this
this.props.onSetSkip(skip + top);
// Here skip has previous value of 0.
this.list();
// Here skip has new value of 10.
}
list() {
this.props.List(this.props.list.top, this.props.list.skip);
}
render () {
return (
<div>
<table> ... </table>
<button onClick={this.nextPage.bind(this)}>Next</button>
</div>
);
}
}
Lorsque le bouton Suivant a été cliqué pour la première fois, valeur de skip
qui utilise une action asynchrone non modifiée . Comment puis-je envoyer une action après sync action?
Merci pour les réponses, mais je l'ai fait de cette façon:
let top = this.props.list.top;
let skip = this.props.list.skip;
let newSkip = skip + top;
this.props.onList(top, newSkip);
this.props.onSetSkip(newSkip);
Tout d'abord, je calcule new skip
et envoie une action asynchrone avec cette nouvelle valeur. J'envoie ensuite une action syns, qui met à jour skip
en état.
Au lieu d'envoyer une action après une action de synchronisation, pouvez-vous simplement appeler la fonction depuis le réducteur?
Donc, il suit ce flux:
Appel d'action de synchronisation -> Appel de réducteur ---> Fonction de casse (réducteur) ---> Fonction de casse (Réducteur)
Au lieu du flux habituel qui vous est probablement destiné:
Appel d'action de synchronisation -> Appel de réducteur
Suivez ce guide pour diviser les réducteurs vers le haut pour voir ce que sont les réducteurs.
Si l'action que vous souhaitez envoyer a des effets secondaires, la méthode correcte consiste à utiliser Thunks. Vous pouvez ensuite envoyer une action après une action.
Exemple pour Thunks :
export const setSkip = (skip) => {
return (dispatch, getState) => {
dispatch(someFunc());
//Do someFunc first then this action, use getState() for currentState if you want
return {
type: 'LIST.SET_SKIP',
skip: skip
};
}
};
Si vous utilisez redux thunk , vous pouvez facilement les combiner ..__ C'est un middleware qui permet aux créateurs d'action de renvoyer une fonction au lieu d'une action.
Votre solution aurait peut-être fonctionné pour vous maintenant si vous n'avez pas besoin de chaîner les créateurs d'action et que vous n'avez besoin que de les exécuter tous les deux.
this.props.onList(top, newSkip);
this.props.onSetSkip(newSkip);
Si vous avez besoin d'un chaînage (en les appelant de manière synchrone) ou d'attendre les données de la première action envoyée, voici ce que je vous recommande.
export function onList(data) {
return (dispatch) => {
dispatch(ONLIST_REQUEST());
return (AsyncAPICall)
.then((response) => {
dispatch(ONLIST_SUCCESS(response.data));
})
.catch((err) => {
console.log(err);
});
};
}
export function setSkip(data) {
return (dispatch) => {
dispatch(SETSKIP_REQUEST());
return (AsyncAPICall(data))
.then((response) => {
dispatch(SETSKIP_SUCCESS(response.data));
})
.catch((err) => {
console.log(err);
});
};
}
export function onListAndSetSkip(dataForOnList) {
return (dispatch) => {
dispatch(onList(dataForOnList)).then((dataAfterOnList) => {
dispatch(setSkip(dataAfterOnList));
});
};
}
vérifiez aussi ceci redux-sequence-action