useEffect(() => { console.log("render"); }); const handleClick = () => { setC1((c) => c + 1); Promise.resolve().then(() => { setC1((c) => c + 1); }); }; const handleClick2 = () => { Promise.resolve().then(() => { setC1((c) => c + 1); }); setC1((c) => c + 1); };
Dans la version React18, pourquoi un seul rendu se produit en cliquant sur la méthode handleClick
方法会出现两次渲染,而点击handleClick2
?
Je veux que le résultat des deux méthodes soit le même. Quelqu'un peut-il me dire pourquoi ils sont différents ?
Je vais vous expliquer en quoi ces séquences d'appels diffèrent et comment le comportement observé est possible.
Je ne peux pas vous dire exactement comment les mises à jour de React se présentent par lots en interne, Je suppose simplement que React propose des optimisations complexes qui ne sont pas pertinentes pour le développeur utilisant React et nécessitent une compréhension approfondie des composants internes de React et peut-être même un changement d'une version à l'autre. (N'hésitez pas à me corriger.)
Différence
La fonctionPromise.resolve()
安排一个新的微任务,实际上相当于window.queueMicrotask()
.
) sont appelés dans la même phase d'exécution.setState
(éventuellement) planifiera également une nouvelle microtâche, Par conséquent leurs rappels (Promise
和setState
Promise ethandleClickA
中,在两个updater
函数之间调用setState2
s'accrochehandleClickB
中,两个updater
Les fonctions de(FIFO
>):handleClickA
handleClickB
:updater
Je suppose que React essaie de regrouper toutes lesc'est-à-dire que chaque fois que seule la fonction de mise à jour est appelée, essayez de les regrouper et de ne mettre à jour l'état final qu'une seule fois. Cependant, si une nouvelle
fonction est appelée, React peutterminer la boucle de mise à jour actuelle
setState
et démarrer un nouveau cycle de rendu avant d'appeler la prochaine fonction updater.Je ne peux que deviner pourquoi cela est fait代码>
Parce que le nouveau
pourrait casser le lot d'une manière ou d'une autre, ousetState
appels sont effectués de manière récursive, le prochain rendu sera trop retardé, ousetState