13. Syntaxe avancée

3. "Snipprops"

C'est valide au Scrabble ça ?

Les snippets peuvent également être fournis en tant que props à d'autres composants. Cela peut servir à personnaliser de l'"extérieur" l'affichage d'un composant, sans avoir besoin de lui passer une multitudes des props différentes.

{#snippet bedroom()}
	<Bed />
	<Desk />
{/snippet}

{#snippet kitchen()}
	<Oven />
	<Fridge />
{/snippet}

<House {bedroom} {kitchen} />

Les snippets fournis en props sont accessibles comme n'importe quelle autre prop.

<!-- House.svelte -->
<script>
	const { bedroom, kitchen } = $props();
</script>

<Wall>
	<Door />

	{@render kitchen()}

	<LivingRoom />

	{@render bedroom()}
</Wall>

Ainsi, je peux tout à fait décider de modifier ce que je mets dans bedroom ou kitchen sans avoir à modifier House.

Vous pouvez également définir les snippets que vous souhaitez passer en props directement "au sein" du markup de l'instance de votre composant. Vous n'aurez alors pas besoin de les passer en tant que props, car cela sera fait automatiquement.

<House>
	{#snippet bedroom()}
		<Bed />
		<Desk />
	{/snippet}

	{#snippet kitchen()}
		<Oven />
		<Fridge />
	{/snippet}
</House>

Snippet children

Si vous le souhaitez, vous pouvez également fournir du markup directement en tant qu'"enfant" d'une instance :

<House>
	{#snippet bedroom()}
		<Bed />
		<Desk />
	{/snippet}

	{#snippet kitchen()}
		<Oven />
		<Fridge />
	{/snippet}

	<TV />
	<div>Painting</div>
</House>

Dans ce cas, Svelte considère que tout le markup "enfant" ne faisant partie explicitement d'un {#snippet} fait partie d'un {#snippet} implicite s'appelant children, auquel vous pouvez accéder en tant que props dans votre composant.

<!-- House.svelte -->
<script>
	const { children, kitchen, bedroom } = $props();
</script>

<Wall>
	<Door />

	{@render kitchen()}

	{@render children()}

	<LivingRoom />

	{@render bedroom()}
</Wall>

Vous pouvez bien sûr ne pas fournir du tout de {#snippet} explicite et vous contenter de children si c'est ce qui vous convient.

Nous avons déjà rencontré children, lorsque nous avons étudié les layouts. C'est exactement cette mécanique de Svelte que SvelteKit utilise pour les fichiers +layout.svelte.

Si vous utilisez TypeScript, vous avez accès au type Snippet que vous pouvez importer du module svelte.

À vous !
  • Passer le markup du scanner en tant que {#snippet} nommé infos à <Grass>, et affichez-le dans Grass.

En savoir plus sur ce chapitre