Для начала предлагаю прочитать о встроенных переходах Vue. Это может позволить вам избежать непосредственного манипулирования DOM.
Тем не менее, основная проблема здесь заключается в атрибуте key
.
При первом рендеринге компонента он создаст 3 <li>
элементов с ключи alert-0
, alert-1
и alert-2
. Технически это немного сложнее, чем это, потому что задействованы VN-узлы, но для пояснения я буду придерживаться только ключей и узлов DOM.
Когда вы удаляете элемент с индексом 1, следующий элемент перетасовывается по месту , Таким образом, элемент, который ранее был в индексе 2, теперь находится в индексе 1.
Когда этот обновленный массив будет обработан, он создаст 2 <li>
узла, один с key
из alert-0
, а другой с alert-1
. Vue затем объединит старые и новые узлы и сделает необходимые исправления для перехода от одного к другому. Здесь все идет не так. Вам нужно, чтобы Vue удалил старый узел DOM alert-1
, но что касается Vue, у него все еще есть узел с именем alert-1
. С точки зрения Vue это alert-2
, который исчез.
Так что Vue удалит узел alert-2
, а не alert-1
. Затем он обновит содержимое alert-1
. Новое содержимое alert-1
будет таким же, как старое содержимое alert-2
. Это может заставить его выглядеть так, как будто style
имеет перескочившие узлы, но это не так, это - перемещенное содержимое.
Решение состоит в том, чтобы использовать key
, привязанный к самому элементу. а не его индекс. Если в вашем случае нет естественного выбора, вы можете использовать некоторую форму случайного числа или счетчика с приращением для создания подходящих идентификаторов в данных.