Я считаю, что он использует что-то вроде индекса элемента по умолчанию, когда вы не предоставляете ключ. Это можно проверить, используя
{#each things as thing, index (index)}
<Thing current={thing.color}/>
{/each}
, что дает такое же поведение, как если бы вы вообще не использовали ключ.
Давайте назовем <Thing>
, который был отображен для id: 1
, как Thing1
и т. Д.
Без ключа
Когда мы удаляем первый элемент из списка , Thing1
по-прежнему остается прежним, потому что связанный с ним ключ (индекс в данном случае) остается прежним. Опора, которая ранее отправлялась на Thing2
, теперь отправляется на Thing1
. Это происходит на всем протяжении цепочки. Но теперь, когда осталось на один элемент меньше, Thing5
удаляется из DOM.
Экземпляр компонента Thing
, связанный с ключом «0» (Thing1
), не уничтожается, когда первый элемент удален. Это происходит потому, что ключ остается прежним (новый массив также имеет элемент с индексом 0). Изменилось только свойство, которое отправляется на Thing1
, оставив переменную initial
с цветом исходного элемента с id: 1
.
С предоставленным ключом (thing.id)
Когда объект с id: 1
удаляется, не существует ни одного экземпляра Thing
, который соответствует «1». Итак, Thing1
удаляется из DOM.
Другой способ понять это - когда вы даете ключ, вы, по сути, говорите Svelte сопоставить каждый отрисованный блок с этим самым ключом. Когда этот ключ больше не существует, избавьтесь от блока и удалите его из DOM. Но если ключ остается прежним, а реквизиты меняются, обновите реквизиты вместо воссоздания блока.
Если вы не указываете ключ, он использует индекс списка в качестве ключа. Таким образом, если вы удалите элементы из списка, блок не будет воссоздан или переупорядочен, а просто обновятся реквизиты.