Краткий ответ
Добавьте ключ в цикл v-for
: v-for="device in devices" :key="{something here}"
.Ваш ключ должен быть уникальным и идентифицировать каждое устройство, даже после копирования устройства
Код
Пожалуйста, проверьте: https://jsfiddle.net/Al_un/9cradxvp/. В целях отладки я изменил несколько вещей:
Длинный ответ
О рендеринге списка
Если ключВ цикле v-for
отсутствует, Vue не знает, как обновить список.Из документации Vue :
Чтобы дать Vue подсказку, чтобы он мог отслеживать идентичность каждого узла и, таким образом, повторно использовать и переупорядочивать существующие элементы, вам необходимо предоставить уникальный ключ-атрибут длякаждый элемент.
Давайте рассмотрим ваш список (я добавил один элемент)
[
{id: 1, name: "a"},
{id: 2, name: "b"},
{id: 3, name: "c"},
{id: 4, name: "d"},
]
Теперь давайте скопируем узел "b".Без :key="device.id"
вывод на консоль составляет
4: d is mounted
3: c is updated
5: b_copy is updated
При :key="device.id"
вывод на консоль составляет только:
5: b_copy is mounted
В основном, без ключей, есть:
- два обновления:
c
становится b_copy
, d
становится c
- одна вставка:
d
создается
Следовательно, последнееЭлемент воссоздается каждый раз, когда вы переходите к копии.Так как open
значение по умолчанию равно true
, очевидно, что d
имеет open = true
.
Если каждый элемент имеет :key="device.id"
, то создается только элемент b_copy
Чтобы проверить это, удалите :key="device.id"
из моей скрипки и посмотрите, что происходит в консоли
Выбор ключа
Поскольку ключ должен однозначно идентифицировать ваше устройство, вы не должны использовать индекс какключ как индекс устройства в массиве изменяется всякий раз, когда вы копируете устройство
Кроме того, поле идентификатора является предпочтительным, поскольку нет гарантии, что имена ваших устройств являются уникальными.Что если вы инициализируете список с помощью
[
{ name: "a"},
{ name: "b"},
{ name: "a"}
]
С функциональной точки зрения это правильно.