以前にも似たような記事を書いたけど、書き直してみたよ。
Svelteの名前付きslot
とは
公式サイトでは、実際に使われている例を提示してくれてます。
一度見てみると感覚はつかみやすいかも(Svelte公式様のこういうのわかりやすい。好き)
Svelteでは、slot
タグを使ってコンポーネントに動的なコンテンツを挿入できる。
名前付きslot
を使うと、コンポーネント内の特定の場所に特定のコンテンツを挿入できる。
普通のslot
をおさらい
ここで普通のslotの概念を簡単におさらいしておきます。
- コンポーネント内に動的なコンテンツにしたい場所に
slot
を入れておく - コンポーネントを利用する際に、コンテンツを中にいれる
<コンポーネント>要素</コンポーネント>
例
コンポーネント定義
例えば、Card.svelte
コンポーネントがあるとして
lib/Card.svelte
<div class="card">
<header>
ヘッダー
</header>
<!-- <slot>デフォルト</slot>でデフォルトの要素を指定も可能 -->
<slot/>
<footer>
フッター
</footer>
</div>
コンポーネントの利用
<script>
import Card from '$lib/Card.svelte';
</script>
<Card>
ここに挿入されるコンテンツは、Cardコンポーネントの`slot`の部分に表示される
</Card>
実際表示されるときは、こういう順番になるよー
<div class="card">
<header>
ヘッダー
</header>
ここに挿入されるコンテンツは、Cardコンポーネントの`slot`の部分に表示される
<footer>
フッター
</footer>
</div>
本題
名前付きslot
の基本
名前付きslot
を使用するためには、
-
コンポーネント内で
slot
に名前を付ける
<slot name=任意の名前>
-
コンポーネントを利用する際に、
slot
を指定
要素に<コンポーネント> <要素 slot=名前></コンポーネント>
を属性指定して配置
例
コンポーネント定義
先程のCardコンポーネントそれぞれを指定できるようにしていく。
lib/Card.svelte
<div class="card">
<header>
<slot name="header">デフォルトのヘッダー</slot>
</header>
<div class="content">
<slot name="content">デフォルトのコンテンツ</slot>
</div>
<footer>
<slot name="footer">デフォルトのフッター</slot>
</footer>
</div>
上記のコンポーネントには、
header
content
footer
の3つの名前付きslot
が設定されている。
普通のslotと同様に、指定されなかった場合は、デフォルトが使われる
コンポーネントの利用
このCard
コンポーネントを利用する際に、特定のslot
にコンテンツを挿入するには、slot
属性を利用します。
<script>
import Card from '$lib/Card.svelte'
</script>
<Card>
<div slot="header">カスタムヘッダー</div>
<div slot="content">カスタムコンテンツ</div>
<div slot="footer">カスタムフッター</div>
</Card>
こんな感じで細かい制御ができるようになります!!便利
参考リンク
公式ドキュメントはこちら(ドキュメントも日本語化されていて比較的わかりやすい)