Je viens de découvrir que la this.setState()
fonction react dans n'importe quel composant est asynchrone ou est appelée après l'achèvement de la fonction dans laquelle elle a été appelée.
Maintenant, j'ai cherché et trouvé ce blog ( l'opération de mutation d'état setState () peut être synchrone dans ReactJS )
Ici, il a trouvé que setState
c'est async (appelé lorsque la pile est vide) ou sync (appelé dès qu'il est appelé) en fonction de la façon dont le changement d'état a été déclenché.
Maintenant, ces deux choses sont difficiles à digérer
- Dans le blog, la
setState
fonction est appelée à l'intérieur d'une fonctionupdateState
, mais ce qui a déclenché laupdateState
fonction n'est pas quelque chose qu'une fonction appelée connaîtrait. - Pourquoi feraient-ils une
setState
asynchrone car JS est un langage à thread unique et que setState n'est pas un appel WebAPI ou serveur, il doit donc être effectué uniquement sur le thread de JS. Font-ils cela pour que le re-rendu n'arrête pas tous les écouteurs d'événements et autres, ou il y a un autre problème de conception.
setState
: medium.com/@agm1984/…Réponses:
Vous pouvez appeler une fonction après la mise à jour de la valeur d'état:
De plus, si vous avez beaucoup d'états à mettre à jour à la fois, regroupez-les tous dans le même
setState
:Au lieu de:
Faites juste ceci:
la source
1) les
setState
actions sont asynchrones et sont groupées pour des gains de performances. Ceci est expliqué dans la documentation desetState
.2) Pourquoi rendraient-ils setState asynchrone car JS est un langage à thread unique et qu'il
setState
ne s'agit pas d'un appel WebAPI ou serveur?C'est parce que
setState
modifie l'état et provoque un nouveau rendu. Cela peut être une opération coûteuse et la rendre synchrone peut laisser le navigateur sans réponse.Ainsi, les appels setState sont asynchrones et groupés pour une meilleure expérience et des performances d'interface utilisateur.
la source
this.setState({ something: true }, () => console.log(this.state))
Je sais que cette question est ancienne, mais elle a causé beaucoup de confusion pour de nombreux utilisateurs de reactjs depuis longtemps, y compris moi. Récemment, Dan Abramov (de l'équipe de réaction) vient d'écrire une excellente explication sur les raisons pour lesquelles la nature de
setState
est asynchrone:https://github.com/facebook/react/issues/11527#issuecomment-360199710
setState
est censé être asynchrone, et il y a quelques très bonnes raisons à cela dans l'explication liée de Dan Abramov. Cela ne veut pas dire qu'il sera toujours asynchrone - cela signifie principalement que vous ne pouvez tout simplement pas dépendre de sa synchronisation . ReactJS prend en compte de nombreuses variables dans le scénario dans lequel vous modifiez l'état, pour décider quand lestate
doit être réellement mis à jour et votre composant rendu.Un exemple simple pour illustrer cela est que si vous appelez
setState
en réaction à une action de l'utilisateur, lestate
sera probablement mis à jour immédiatement (même si, encore une fois, vous ne pouvez pas compter dessus), de sorte que l'utilisateur ne ressentira aucun retard , mais si vous appelezsetState
en réaction à une réponse d'appel ajax ou à un autre événement qui n'est pas déclenché par l'utilisateur, l'état peut être mis à jour avec un léger retard, car l'utilisateur ne ressentira pas vraiment ce retard et améliorera les performances en attendant groupez plusieurs mises à jour d'état ensemble et rendez le DOM moins de fois.la source
Bon article ici https://github.com/vasanthk/react-bits/blob/master/patterns/27.passing-function-to-setState.md
ou passer le rappel
this.setState ({.....},callback)
https://medium.com/javascript-scene/setstate-gate-abc10a9b2d82 https://medium.freecodecamp.org/functional-setstate-is-the-future-of-react-374f30401b6b
la source
Vous pouvez utiliser l'habillage suivant pour effectuer un appel de synchronisation
la source
Imaginez incrémenter un compteur dans un composant:
Il existe un gestionnaire de comptage attaché aux composants parent et enfant. Ceci est fait exprès afin que nous puissions exécuter le setState () deux fois dans le même contexte de bullage d'événement de clic, mais à partir de 2 gestionnaires différents.
Comme nous l'imaginons, un seul événement de clic sur le bouton déclencherait maintenant ces deux gestionnaires puisque l'événement bouillonnait de la cible vers le conteneur le plus à l'extérieur pendant la phase de bullage.
Par conséquent, le btnCountHandler () s'exécute en premier, devrait incrémenter le nombre à 1, puis le divCountHandler () s'exécute, devrait incrémenter le nombre à 2.
Cependant, le nombre augmente uniquement à 1 comme vous pouvez l'inspecter dans les outils React Developer.
Cela prouve que réagissent
met en file d'attente tous les appels setState
revient dans cette file d'attente après avoir exécuté la dernière méthode dans le contexte (le divCountHandler dans ce cas)
fusionne toutes les mutations d'objet qui se produisent dans plusieurs appels setState dans le même contexte (tous les appels de méthode dans une seule phase d'événement sont le même contexte pour, par exemple) en une seule syntaxe de mutation d'objet (la fusion a du sens car c'est pourquoi nous pouvons mettre à jour les propriétés de l'état indépendamment dans setState () en premier lieu)
et le transmet à un seul setState () pour empêcher le re-rendu dû à plusieurs appels à setState () (c'est une description très primitive du traitement par lots).
Code résultant exécuté par react:
Pour arrêter ce comportement, au lieu de passer des objets en tant qu'arguments à la méthode setState, des rappels sont passés.
Une fois que la dernière méthode a terminé son exécution et que react revient pour traiter la file d'attente setState, elle appelle simplement le rappel pour chaque setState mis en file d'attente, en passant l'état précédent du composant.
De cette façon, react garantit que le dernier rappel de la file d'attente met à jour l'état sur lequel tous ses homologues précédents ont mis la main.
la source
Oui, setState () est asynchrone.
Depuis le lien: https://reactjs.org/docs/react-component.html#setstate
Parce qu'ils pensent
du lien: https://github.com/facebook/react/issues/11527#issuecomment-360199710
La fonction asynchrone setState () rend la vie très difficile pour les débutants et même les expérimentés malheureusement:
- problèmes de rendu inattendus: rendu retardé ou pas de rendu (basé sur la logique du programme)
- passer des paramètres est un gros problème
parmi d'autres problèmes.
L'exemple ci-dessous a aidé:
J'espère que cela pourra aider.
la source