2.4.2
https://jsbin.com/qejofexedo/edit?html , js, salida
ver enlace de reproducción.
Cuando hago clic en Expand is True
, luego expand
para convertirme en false
. Y solo countA
cambió.
Cuando hago clic en Expand is Ture
, no pasó nada.
Los countA
y countB
cambiaron.
Supongo que cuando hago clic, expand
cambió a false
, pero inmediatamente se activó el evento de clic. Ejecuta otro evento de clic de vnode. Luego expanda cambiado a true
.
p
, section
, no se producen errores.i
etiqueta principal div
en el primer div, no se producen errores
parece normal
Tu reproducción funciona según lo previsto ...
@Kingwl @ yyx990803 Lo siento. Probé el caso de otros y olvidé volver a cambiar.
El código importante es
<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>
Hay cuatro casos:
block 1
y block2
, funciona bienelement 1
y element 2
, funciona bienblock 1
y element 2
, cambie expand
a verdadero está bien. Pero no puedo volver atrás.element 1
y block 2
, no se puede cambiar expand
a falso. Pero puede cambiar expand
a verdadero.Entonces, esto sucede porque:
<i>
activa, lo que desencadena una primera actualización en nextTick (microtask)Esto es bastante complicado de solucionar, y otras bibliotecas que aprovechan la microtarea para la cola de actualización también tienen este problema (por ejemplo, Preact). React no parece tener este problema porque usan un sistema de eventos sintéticos (probablemente debido a casos extremos como este).
Para solucionarlo, simplemente puede darles a los dos div externos claves diferentes para forzar su reemplazo durante las actualizaciones. Esto evitaría que se recoja el evento burbujeado:
<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>
Comentario más útil
Entonces, esto sucede porque:
<i>
activa, lo que desencadena una primera actualización en nextTick (microtask)Esto es bastante complicado de solucionar, y otras bibliotecas que aprovechan la microtarea para la cola de actualización también tienen este problema (por ejemplo, Preact). React no parece tener este problema porque usan un sistema de eventos sintéticos (probablemente debido a casos extremos como este).
Para solucionarlo, simplemente puede darles a los dos div externos claves diferentes para forzar su reemplazo durante las actualizaciones. Esto evitaría que se recoja el evento burbujeado: