Перейти к содержимому
GitHub

{#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 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 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

{#each expression as name}...{:else}...{/each}

Блок each также может иметь часть {:else}, которая рендерится, если список пуст:

{#each todos as todo}
  <p>{todo.text}</p>
{:else}
  <p>Сегодня задач нет!</p>
{/each}