2.4.2
https://jsbin.com/qejofexedo/edit?html , js, Ausgabe
siehe Reproduktionslink.
Wenn ich auf Expand is True
, dann auf expand
, um false
. Und nur countA
geändert.
Wenn ich auf Expand is Ture
, ist nichts passiert.
Die countA
und countB
geändert.
Ich denke, wenn ich klicke, ändert sich expand
in false
, aber sofort wird das Klickereignis ausgelöst. Es führt ein anderes vnode-Klickereignis aus. Erweitern Sie dann geändert in true
.
p
, section
, treten keine Fehler auf.i
-Tag zum übergeordneten div
-Tag im ersten Div verschiebe, treten keine Fehler auf
scheint normal
Ihr Repro funktioniert wie vorgesehen ...
@Kingwl @ yyx990803 Entschuldigung. Ich teste den Fall anderer und habe vergessen, mich zurückzuziehen.
Der wichtige Code ist
<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>
Es gibt vier Fälle:
block 1
und block2
, funktioniert gutelement 1
und element 2
, funktioniert gutblock 1
und element 2
. Ändern Sie expand
in true. Kann sich aber nicht zurück ändern.element 1
und block 2
. expand
kann nicht in false geändert werden. Kann aber expand
in true ändern.Das passiert also, weil:
<i>
wird ausgelöst und löst ein erstes Update bei nextTick (Mikrotask) aus.Dies ist in der Korrektur ziemlich schwierig, und andere Bibliotheken, die Mikrotask für die Aktualisierungswarteschlange nutzen, haben ebenfalls dieses Problem (z. B. Preact). React scheint dieses Problem nicht zu haben, da sie ein synthetisches Ereignissystem verwenden (wahrscheinlich aufgrund solcher Randfälle).
Um dies zu umgehen, können Sie den beiden äußeren Divs einfach unterschiedliche Schlüssel geben, damit sie bei Aktualisierungen ersetzt werden. Dies würde verhindern, dass das sprudelnde Ereignis erfasst wird:
<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>
Hilfreichster Kommentar
Das passiert also, weil:
<i>
wird ausgelöst und löst ein erstes Update bei nextTick (Mikrotask) aus.Dies ist in der Korrektur ziemlich schwierig, und andere Bibliotheken, die Mikrotask für die Aktualisierungswarteschlange nutzen, haben ebenfalls dieses Problem (z. B. Preact). React scheint dieses Problem nicht zu haben, da sie ein synthetisches Ereignissystem verwenden (wahrscheinlich aufgrund solcher Randfälle).
Um dies zu umgehen, können Sie den beiden äußeren Divs einfach unterschiedliche Schlüssel geben, damit sie bei Aktualisierungen ersetzt werden. Dies würde verhindern, dass das sprudelnde Ereignis erfasst wird: