À l'aide de async setState
J'ai une fonction qui a envoyé une action. Je voudrais afficher un loader avant et après l'action. Je sais que réagir de la composition de l'objet passé en setState
. la question est de savoir comment puis-je mettre à jour la propriété de façon asynchrone:
handleChange(input) {
this.setState({ load: true })
this.props.actions.getItemsFromThirtParty(input)
this.setState({ load: false })
}
Fondamentalement, tout a très bien fonctionné si j'ai mis cette propriété dans le cadre de l'état de l'application (à l'aide de Redux), mais je préfère vraiment mettre cette propriété à la gestion des composants de l'état seulement.
- Comment à ce sujet.accessoires de jeu.dispatch(getItemsFromThirtParty()).puis(/* ce */) sur le composant de niveau? Je veux dire, en tant qu'auteur de redux écrit ici - stackoverflow.com/a/33168143/6538824 avez-vous vraiment besoin d'un redux-il?
- Alors, comment envisagez-vous de rendre à nouveau le composant lors de la fin de l'action?
- Giorgi, c'est exactement le point. Je ne veux pas utiliser redux pour le "loader" de l'état. Bien sûr, j'ai besoin de redux pour l'état de l'application (DONNÉES réelles). Le chargeur appartient à la seule composante, et il ne devrait pas être un pert des données de l'application. Je souhaite juste pour l'afficher quand je suis aller chercher les données, et de le cacher après je reçois la réponse.
Vous devez vous connecter pour publier un commentaire.
Envelopper le reste de votre code dans le rappel de la première
setState
:Avec cela, votre
load
est garanti d'être mis àtrue
avantgetItemsFromThirtParty
est appelée et leload
est àfalse
.Cela suppose que votre
getItemsFromThirtParty
fonction est synchrone. Si elle n'est pas, la transformer en une promesse et ensuite appeler la finalesetState
dans un enchaînésthen()
méthode:vous pouvez envelopper le setState en une Promesse et l'utilisation async/await comme ci-dessous
Source: ASYNC ATTENDENT À RÉAGIR
const asyncSetState = instance => newState => new Promise(resolve => instance.setState(newState, resolve));
que vous pouvez utiliser dans un composant comme si ...await asyncSetState(this)({ mystuff: false });
Voici ce que vous pouvez faire...
onFetchComplete
de rappel, avec leinput
.Changer votre handleChange à
Cela permettra d'assurer l'action processeur code peut invoquer de nouveau votre état de changement de rappel, même si elle n'est pas écrite dans une promesse de mode.
Une petite mise à jour à l'aide de promesses pour l'action créateurs et async/await fonctionne très bien, et ça rend le code plus propre, par rapport à la "puis" chaînage:
Bien sûr, c'est une question de goût.
EDIT : Ajout du support manquant
this.setState({ load: false );
dansfinally
si vous n'avez pas besoin de notifier une erreur, votre code sera plus succincte ;).