mirror of https://github.com/sveltejs/svelte
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
93 lines
2.2 KiB
93 lines
2.2 KiB
2 years ago
|
---
|
||
2 months ago
|
title: {#each ...}
|
||
2 years ago
|
---
|
||
|
|
||
|
```svelte
|
||
1 year ago
|
<!--- copy: false --->
|
||
2 years ago
|
{#each expression as name}...{/each}
|
||
|
```
|
||
|
|
||
|
```svelte
|
||
1 year ago
|
<!--- copy: false --->
|
||
2 years ago
|
{#each expression as name, index}...{/each}
|
||
|
```
|
||
|
|
||
2 months ago
|
Iterating over values can be done with an each block. The values in question can be arrays, array-like objects (i.e. anything with a `length` property), or iterables like `Map` and `Set` — in other words, anything that can be used with `Array.from`.
|
||
2 years ago
|
|
||
|
```svelte
|
||
|
<h1>Shopping list</h1>
|
||
|
<ul>
|
||
|
{#each items as item}
|
||
|
<li>{item.name} x {item.qty}</li>
|
||
|
{/each}
|
||
|
</ul>
|
||
|
```
|
||
|
|
||
|
You can use each blocks to iterate over any array or array-like value — that is, any object with a `length` property.
|
||
|
|
||
|
An each block can also specify an _index_, equivalent to the second argument in an `array.map(...)` callback:
|
||
|
|
||
|
```svelte
|
||
|
{#each items as item, i}
|
||
|
<li>{i + 1}: {item.name} x {item.qty}</li>
|
||
|
{/each}
|
||
|
```
|
||
|
|
||
2 months ago
|
## Keyed each blocks
|
||
|
|
||
|
```svelte
|
||
|
<!--- copy: false --->
|
||
|
{#each expression as name (key)}...{/each}
|
||
|
```
|
||
|
|
||
|
```svelte
|
||
|
<!--- copy: false --->
|
||
|
{#each expression as name, index (key)}...{/each}
|
||
|
```
|
||
|
|
||
2 years ago
|
If a _key_ expression is provided — which must uniquely identify each list item — Svelte will use it to diff the list when data changes, rather than adding or removing items at the end. The key can be any object, but strings and numbers are recommended since they allow identity to persist when the objects themselves change.
|
||
|
|
||
|
```svelte
|
||
|
{#each items as item (item.id)}
|
||
|
<li>{item.name} x {item.qty}</li>
|
||
|
{/each}
|
||
|
|
||
|
<!-- or with additional index value -->
|
||
|
{#each items as item, i (item.id)}
|
||
|
<li>{i + 1}: {item.name} x {item.qty}</li>
|
||
|
{/each}
|
||
|
```
|
||
|
|
||
|
You can freely use destructuring and rest patterns in each blocks.
|
||
|
|
||
|
```svelte
|
||
|
{#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}
|
||
|
```
|
||
|
|
||
2 months ago
|
## Else blocks
|
||
|
|
||
|
```svelte
|
||
|
<!--- copy: false --->
|
||
|
{#each expression as name}...{:else}...{/each}
|
||
|
```
|
||
|
|
||
2 years ago
|
An each block can also have an `{:else}` clause, which is rendered if the list is empty.
|
||
|
|
||
|
```svelte
|
||
|
{#each todos as todo}
|
||
|
<p>{todo.text}</p>
|
||
|
{:else}
|
||
|
<p>No tasks today!</p>
|
||
|
{/each}
|
||
|
```
|