2.4.2
https://jsbin.com/qejofexedo/edit?html , js, вывод
см. ссылку на воспроизведение.
Когда я нажимаю Expand is True
, затем expand
становится false
. И изменилось только countA
.
Когда я нажимаю Expand is Ture
, ничего не происходит.
Значения countA
и countB
изменились.
Я предполагаю, что когда я нажимаю, expand
меняется на false
, но сразу запускается событие щелчка. Он выполняет еще одно событие щелчка vnode. Затем развернуть изменено на true
.
p
, section
, ошибок не произойдет.i
в родительский тег div
в первом 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>
запускается, вызывая 1-е обновление на 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>
запускается, вызывая 1-е обновление на nextTick (микрозадача)Это довольно сложно исправить, и другие библиотеки, которые используют микрозадачи для постановки в очередь обновлений, также имеют эту проблему (например, Preact). У React, похоже, нет этой проблемы, потому что они используют синтетическую систему событий (вероятно, из-за крайних случаев, подобных этому).
Чтобы обойти это, вы можете просто дать двум внешним div разные ключи, чтобы принудительно заменить их во время обновлений. Это предотвратит появление всплывающего события: