2.4.2
https://jsbin.com/qejofexedo/edit?html,js ,输出
参见复制链接。
当我单击Expand is True
,然后expand
变为false
。 仅有countA
更改。
当我单击Expand is Ture
,什么都没有发生。
countA
和countB
更改。
我想当我单击时, expand
更改为false
,但是立即触发了click事件。 它执行另一个vnode单击事件。 然后展开更改为true
。
p
, section
,则不会发生错误。i
标记移至父级div
标记,则不会发生任何错误
看起来很正常
您的生殖器正在按预期工作...
@Kingwl @ yyx990803抱歉。 我测试别人的情况,忘了找回。
重要的代码是
<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>
有四种情况:
block 1
和block2
,效果很好element 1
和element 2
,效果很好block 1
和element 2
,将expand
更改为true是可以的。 但是无法改变。element 1
和block 2
,不能将expand
更改为false。 但是可以将expand
更改为true。因此,发生这种情况是因为:
<i>
上的内部点击事件触发,触发nextTick的第一次更新(微任务)这在修复中非常棘手,其他利用微任务进行更新排队的库也存在此问题(例如Preact)。 React似乎没有这个问题,因为它们使用了综合事件系统(可能是由于类似这样的极端情况)。
要解决此问题,您只需为两个外部div提供不同的键,以强制在更新过程中将其替换。 这将阻止冒泡的事件被拾取:
<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>
最有用的评论
因此,发生这种情况是因为:
<i>
上的内部点击事件触发,触发nextTick的第一次更新(微任务)这在修复中非常棘手,其他利用微任务进行更新排队的库也存在此问题(例如Preact)。 React似乎没有这个问题,因为它们使用了综合事件系统(可能是由于类似这样的极端情况)。
要解决此问题,您只需为两个外部div提供不同的键,以强制在更新过程中将其替换。 这将阻止冒泡的事件被拾取: