Các thành phần có thể truyền dữ liệu trở lại cho nội dung được đặt vào thông qua slot prop. Trong ứng dụng này, chúng ta có một danh sách các màu CSS được đặt tên. Việc gõ vào ô <input> sẽ lọc danh sách.
Hiện tại, mỗi hàng hiển thị AliceBlue, và mặc dù màu này rất đẹp, nhưng đó không phải là điều chúng ta muốn.
Mở tệp FilterableList.svelte. Thẻ <slot> được hiển thị cho mỗi mục đã được lọc trong danh sách. Truyền dữ liệu vào slot:
<div class="content">
{#each data.filter(matches) as item}
<slot {item}></slot>
{/each}
</div>(Giống như ở các ngữ cảnh khác, {item} là cách rút gọn của item={item}.)
Sau đó, ở phía bên kia, hãy cung cấp liệu cho nội dung được đặt vào thông qua chị thị let:
<FilterableList
data={colors}
field="name"
let:item={row}
>
<div class="row">
<span class="color" style="background-color: {row.hex}" />
<span class="name">{row.name}</span>
<span class="hex">{row.hex}</span>
<span class="rgb">{row.rgb}</span>
<span class="hsl">{row.hsl}</span>
</div>
</FilterableList>Cuối cùng, loại bỏ biến giữ chỗ, chúng ta không còn cần chúng nữa:
<script>
import FilterableList from './FilterableList.svelte';
import { colors } from './colors.js';
let row = colors[0];
</script>Các slot được đặt tên cũng có thể có prop; sử dụng chỉ thị
lettrên một phần tử có thuộc tínhslot="...", thay vì trên chính thành phần đó.
<script>
import FilterableList from './FilterableList.svelte';
import { colors } from './colors.js';let row = colors[0];
</script>
<FilterableList
data={colors}field="name"
>
<header slot="header" class="row">
<span class="color"></span>
<span class="name">name</span>
<span class="hex">hex</span>
<span class="rgb">rgb</span>
<span class="hsl">hsl</span>
</header>
<div class="row">
<span class="color" style="background-color: {row.hex}"></span> <span class="name">{row.name}</span> <span class="hex">{row.hex}</span> <span class="rgb">{row.rgb}</span> <span class="hsl">{row.hsl}</span></div>
</FilterableList>
<style>
.row {display: grid;
align-items: center;
grid-template-columns: 2em 4fr 3fr;
gap: 1em;
padding: 0.1em;
background: var(--bg-1);
border-radius: 0.2em;
}
header {font-weight: bold;
}
.row:not(header):hover {background: var(--bg-2);
}
.color {aspect-ratio: 1;
height: 100%;
border-radius: 0.1em;
}
.rgb, .hsl {display: none;
}
@media (min-width: 40rem) { .row {grid-template-columns: 2em 4fr 3fr 3fr;
}
.rgb {display: block;
}
}
@media (min-width: 60rem) { .row {grid-template-columns: 2em 4fr 3fr 3fr 3fr;
}
.hsl {display: block;
}
}
</style>