2.4.2
https://jsbin.com/qejofexedo/edit?html , js, sortie
voir le lien de reproduction.
Lorsque je clique sur Expand is True
, alors expand
devient false
. Et seulement countA
changé.
Lorsque je clique sur Expand is Ture
, rien ne se passe.
Les countA
et countB
changé.
Je suppose que lorsque je clique, expand
devient false
, mais immédiatement l'événement de clic déclenché. Il exécute un autre événement de clic vnode. Ensuite, le développement devient true
.
p
, section
, aucune erreur ne se produit.i
balise div
dans le premier div, aucune erreur ne se produit
semble normal
Votre repro fonctionne comme prévu ...
@Kingwl @ yyx990803 Désolé pour ça. J'ai testé d'autres cas et j'ai oublié de revenir en arrière.
Le code important est
<div class="header" v-if="expand"> // block 1
<i @click="expand = false, countA++">Expand is True</i> // element 1
</div>
<div class="expand" v-if="!expand" @click="expand = true, countB++"> // block 2
<i>Expand is False</i> // element 2
</div>
Il y a quatre cas:
block 1
et block2
, fonctionne bienelement 1
et element 2
, fonctionne bienblock 1
et element 2
, changez expand
en true c'est ok. Mais je ne peux pas revenir en arrière.element 1
et block 2
, impossible de changer expand
en faux. Mais peut changer expand
en vrai.Donc, cela se produit parce que:
<i>
se déclenche, déclenchant une 1ère mise à jour sur nextTick (microtask)C'est assez délicat dans le correctif, et d'autres bibliothèques qui utilisent la microtâche pour la mise en file d'attente des mises à jour ont également ce problème (par exemple Preact). React ne semble pas avoir ce problème car ils utilisent un système d'événements synthétiques (probablement à cause de cas extrêmes comme celui-ci).
Pour contourner ce problème, vous pouvez simplement attribuer des clés différentes aux deux div externes pour les forcer à être remplacées lors des mises à jour. Cela empêcherait l'événement de bulles d'être capté:
<div class="header" v-if="expand" key="1"> // block 1
<i @click="expand = false, countA++">Expand is True</i> // element 1
</div>
<div class="expand" v-if="!expand" @click="expand = true, countB++" key="2"> // block 2
<i>Expand is False</i> // element 2
</div>
Commentaire le plus utile
Donc, cela se produit parce que:
<i>
se déclenche, déclenchant une 1ère mise à jour sur nextTick (microtask)C'est assez délicat dans le correctif, et d'autres bibliothèques qui utilisent la microtâche pour la mise en file d'attente des mises à jour ont également ce problème (par exemple Preact). React ne semble pas avoir ce problème car ils utilisent un système d'événements synthétiques (probablement à cause de cas extrêmes comme celui-ci).
Pour contourner ce problème, vous pouvez simplement attribuer des clés différentes aux deux div externes pour les forcer à être remplacées lors des mises à jour. Cela empêcherait l'événement de bulles d'être capté: