{#each ...}
{#each expression as name}...{/each}
{#each expression as name, index}...{/each}
Итерацию по значениям можно выполнять с помощью блока each
. Значения могут быть массивами, объектами, похожими на массивы (т. е. любыми объектами со свойством length
), или итерируемыми объектами, такими как Map
и Set
— другими словами, всем, что можно использовать с Array.from
:
<h1>Список покупок</h1><ul> {#each items as item} <li>{item.name} x {item.qty}</li> {/each}</ul>
Блок each
также может указывать индекс, аналогичный второму аргументу в функции обратного вызова array.map(...)
:
{#each items as item, i} <li>{i + 1}: {item.name} x {item.qty}</li>{/each}
Блоки each
с привязкой по ключам
Заголовок раздела «Блоки each с привязкой по ключам»{#each expression as name (key)}...{/each}
{#each expression as name, index (key)}...{/each}
Если предоставлено выражение key, которое должно уникально идентифицировать каждый элемент списка, Svelte использует его для выполнения сравнения списка при изменении данных, а не добавления или удаления элементов в конце. Ключ может быть любым объектом, но рекомендуется использовать строки и числа, так как они позволяют сохранять идентичность, когда сами объекты изменяются:
{#each items as item (item.id)} <li>{item.name} x {item.qty}</li>{/each}
<!-- или с дополнительным значением индекса -->{#each items as item, i (item.id)} <li>{i + 1}: {item.name} x {item.qty}</li>{/each}
Вы можете свободно использовать деструктуризацию и паттерны rest в блоках each
:
{#each items as { id, name, qty }, i (id)} <li>{i + 1}: {name} x {qty}</li>{/each}
{#each objects as { id, ...rest }} <li><span>{id}</span><MyComponent {...rest} /></li>{/each}
{#each items as [id, ...rest]} <li><span>{id}</span><MyComponent values={rest} /></li>{/each}
Блоки each
без элемента
Заголовок раздела «Блоки each без элемента»{#each expression}...{/each}
{#each expression, index}...{/each}
Если вы хотите просто отрендерить что-то n
раз, вы можете опустить часть as
(демонстрация):
<div class="chess-board"> {#each { length: 8 }, rank} {#each { length: 8 }, file} <div class:black={(rank + file) % 2 === 1}></div> {/each} {/each}</div>
Блоки else
Заголовок раздела «Блоки else»{#each expression as name}...{:else}...{/each}
Блок each
также может иметь часть {:else}
, которая рендерится, если список пуст:
{#each todos as todo} <p>{todo.text}</p>{:else} <p>Сегодня задач нет!</p>{/each}