Oui, il y en a, car setState
fonctionne de manière asynchrone
. Cela signifie qu'après avoir appelé setState
, la variable this.state
n'est pas immédiatement modifiée. Donc si vous souhaitez effectuer une action immédiatement après avoir défini l'état d'une variable d'état, puis renvoyer un résultat, un rappel sera utile
Considérez l'exemple ci-dessous
....
changeTitle: function changeTitle (event) {
this.setState({ title: event.target.value });
this.validateTitle();
},
validateTitle: function validateTitle () {
if (this.state.title.length === 0) {
this.setState({ titleError: "Le titre ne peut pas être vide" });
}
},
....
Le code ci-dessus peut ne pas fonctionner comme prévu car la variable title
peut ne pas avoir été modifiée avant la validation. Vous pourriez vous demander si nous pouvons effectuer la validation dans la fonction render()
elle-même, mais il serait mieux et plus propre si nous pouvons gérer cela dans la fonction changeTitle elle-même car cela rendrait votre code plus organisé et compréhensible
Dans ce cas, le rappel est utile
....
changeTitle: function changeTitle (event) {
this.setState({ title: event.target.value }, function() {
this.validateTitle();
});
},
validateTitle: function validateTitle () {
if (this.state.title.length === 0) {
this.setState({ titleError: "Le titre ne peut pas être vide" });
}
},
....
Un autre exemple serait lorsque vous voulez dispatch
une action lorsque l'état change. vous voudrez le faire dans un rappel et non dans le render()
car il sera appelé à chaque nouvelle rendu onState
ou lorsque certaines props transmises à le Composant Enfant
changé.
Un autre cas est un Appel API
Un cas peut se présenter lorsque vous avez besoin de faire un appel API en fonction d'un changement d'état particulier, si vous le faites dans la méthode render, il sera appelé à chaque rendu onState
changement ou parce que certaines Prop transmises au Composant Enfant
ont changé.
Dans ce cas, vous voudrez utiliser un rappel de setState
pour transmettre la valeur d'état mise à jour à l'appel API
....
changeTitle: function (event) {
this.setState({ title: event.target.value }, () => this.FonctionAppelAPI());
},
FonctionAppelAPI: function () {
// Appeler l'API avec la valeur mise à jour
}
....
4 votes
Il est actuellement peu clair de savoir ce que vous demandez. Pouvez-vous inclure du code?
4 votes
Le rappel de setState est pour tout ce que vous voulez faire après que l'état ait DEFINITIVEMENT été modifié. Puisque setState est asynchrone, si vous voulez appeler une fonction et être SÛR que le nouvel état est chargé, c'est à cela que sert le rappel
4 votes
Le cas d'utilisation du rappel de setState est assez clair. Vous l'utilisez lorsque vous voulez qu'une fonction s'exécute après qu'un état SPÉCIFIQUE a été mis à jour. Si vous mettez cette fonction dans
render()
à la place, elle s'exécutera à chaque fois qu'un ÉTAT quelconque est mis à jour, ce qui n'est probablement pas ce que vous voulez. Cela rendra également votre code moins lisible et logique.0 votes
Un cas d'utilisation est lorsque vous utilisez l'état pour stocker un résultat du serveur... vous le voulez maintenant, pas après un rendu car l'état est une variable personnalisée comme... myVar, setMyVar