Skip to main content

コンポーネントは <svelte:component> でそのタイプを完全に変更することができます。この演習では、colorred なら RedThing.svelte を、green なら GreenThing.svelte を、というように表示したいと思います。

if ブロックの長い列を使ってこれを行うこともできます…

App.svelte
{#if selected.color === 'red'}
	<RedThing/>
{:else if selected.color === 'green'}
	<GreenThing/>
{:else if selected.color === 'blue'}
	<BlueThing/>
{/if}

…これだと少し面倒です。代わりに、動的なコンポーネントを1つ作ることができます:

App.svelte
<select bind:value={selected}>
	{#each options as option}
		<option value={option}>{option.color}</option>
	{/each}
</select>

<svelte:component this={selected.component} />

this 値には任意のコンポーネントコンストラクタ、または falsy な値を指定できます。falsy の値を指定した場合、コンポーネントはレンダリングされません。

Next: <svelte:element>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<script>
	import RedThing from './RedThing.svelte';
	import GreenThing from './GreenThing.svelte';
	import BlueThing from './BlueThing.svelte';
 
	const options = [
		{ color: 'red', component: RedThing },
		{ color: 'green', component: GreenThing },
		{ color: 'blue', component: BlueThing }
	];
 
	let selected = options[0];
</script>
 
<select bind:value={selected}>
	{#each options as option}
		<option value={option}>{option.color}</option>
	{/each}
</select>
 
{#if selected.color === 'red'}
	<RedThing />
{:else}
	<p>TODO others</p>
{/if}
 
initialising