```svelte {#snippet name()}...{/snippet} ``` ```svelte {#snippet name(param1, param2, paramN)}...{/snippet} ``` Les snippets, ainsi que les [balises de rendu (_render tags_)](@render) sont un moyen de créer des morceaux de markup réutilisables dans vos composants. Plutôt que d'écrire du code dupliqué comme [ceci](/playground/untitled#H4sIAAAAAAAAE5VUYW-kIBD9K8Tmsm2yXXRzvQ-s3eR-R-0HqqOQKhAZb9sz_vdDkV1t000vRmHewMx7w2AflbIGG7GnPlK8gYhFv42JthG-m9Gwf6BGcLbVXZuPSGrzVho8ZirDGpDIhldgySN5GpEMez9kaNuckY1ANJZRamRuu2ZnhEZt6a84pvs43mzD4pMsUDDi8DMkQFYCGdkvsJwblFq5uCik9bmJ4JZwUkv1eoknWigX2eGNN6aGXa6bjV8ybP-X7sM36T58SVcrIIV2xVIaA41xeD5kKqWXuqpUJEefOqVuOkL9DfBchGrzWfu0vb-RpTd3o-zBR045Ga3HfuE5BmJpKauuhbPtENlUF2sqR9jqpsPSxWsMrlngyj3VJiyYjJXb1-lMa7IWC-iSk2M5Zzh-SJjShe-siq5kpZRPs55BbSGU5YPyte4vVV_VfFXxVb10dSLf17pS2lM5HnpPxw4Zpv6x-F57p0jI3OKlVnhv5V9wPQrNYQQ9D_f6aGHlC89fq1Z3qmDkJCTCweOGF4VUFSPJvD_DhreVdA0eu8ehJJ5x91dBaBkpWm3ureCFPt3uzRv56d4kdp-2euG38XZ6dsnd3ZmPG9yRBCrzRUvi-MccOdwz3qE-fOZ7AwAhlrtTUx3c76vRhSwlFBHDtoPhefgHX3dM0PkEAAA=)... ```svelte {#each images as image} {#if image.href}
{image.caption}
{image.caption}
{:else}
{image.caption}
{image.caption}
{/if} {/each} ``` ... vous pouvez écrire [ceci](/playground/untitled#H4sIAAAAAAAAE5VUYW-bMBD9KxbRlERKY4jWfSA02n5H6QcXDmwVbMs-lnaI_z6D7TTt1moTAnPvzvfenQ_GpBEd2CS_HxPJekjy5IfWyS7BFz0b9id0CM62ajDVjBS2MkLjqZQldoBE9KwFS-7I_YyUOPqlRGuqnKw5orY5pVpUduj3mitUln5LU3pI0_UuBp9FjTwnDr9AHETLMSeHK6xiGoWSLi9yYT034cwSRjohn17zcQPNFTs8s153sK9Uv_Yh0-5_5d7-o9zbD-UqCaRWrllSYZQxLw_HUhb0ta-y4NnJUxfUvc7QuLJSaO0a3oh2MLBZat8u-wsPnXzKQvTtVVF34xK5d69ThFmHEQ4SpzeVRediTG8rjD5vBSeN3E5JyHh6R1DQK9-iml5kjzQUN_lSgVU8DhYLx7wwjSvRkMDvTjiwF4zM1kXZ7DlF1eN3A7IG85e-zRrYEjjm0FkI4Cc7Ripm0pHOChexhcWXzreeZyRMU6Mk3ljxC9w4QH-cQZ_b3T5pjHxk1VNr1CDrnJy5QDh6XLO6FrLNSRb2l9gz0wo3S6m7HErSgLsPGMHkpDZK31jOanXeHPQz-eruLHUP0z6yTbpbrn223V70uMXNSpQSZjpL0y8hcxxpNqA6_ql3BQAxlxvfpQ_uT9GrWjQC6iRHM8D0MP0GQsIi92QEAAA=) : ```svelte {#snippet figure(image)}
{image.caption}
{image.caption}
{/snippet} {#each images as image} {#if image.href} {@render figure(image)} {:else} {@render figure(image)} {/if} {/each} ``` Comme avec les déclarations de fonctions, les snippets peuvent avoir un nombre arbitraire de paramètres, qui peuvent avoir des valeurs par défaut, et vous pouvez déstructurer chaque paramètre. Vous ne pouvez cependant pas utiliser de paramètre de reste. ## Portée de snippet [!VO]Snippet scope Les snippets peuvent être déclarés n'importe où dans votre composant. Ils peuvent référencer des valeurs déclarées en dehors de leur définition, par exemple dans une balise ` {#snippet hello(name)}

salut {name} ! {message} !

{/snippet} {@render hello('alice')} {@render hello('bob')} ``` ... et ils sont "visibles" par tout ce qui se trouve dans la même portée lexicale (c-à-d les balises soeurs, et les enfants de ces balises) : ```svelte
{#snippet x()} {#snippet y()}...{/snippet} {@render y()} {/snippet} {@render y()}
{@render x()} ``` Les snippets peuvent se référencer eux-mêmes et les uns les autres ([demo](/playground/untitled#H4sIAAAAAAAAE2WPTQqDMBCFrxLiRqH1Zysi7TlqF1YnENBJSGJLCYGeo5tesUeosfYH3c2bee_jjaWMd6BpfrAU6x5oTvdS0g01V-mFPkNnYNRaDKrxGxto5FKCIaeu1kYwFkauwsoUWtZYPh_3W5FMY4U2mb3egL9kIwY0rbhgiO-sDTgjSEqSTvIDs-jiOP7i_MHuFGAL6p9BtiSbOTl0GtzCuihqE87cqtyam6WRGz_vRcsZh5bmRg3gju4Fptq_kzQBAAA=)) : ```svelte {#snippet blastoff()} 🚀 {/snippet} {#snippet countdown(n)} {#if n > 0} {n}... {@render countdown(n - 1)} {:else} {@render blastoff()} {/if} {/snippet} {@render countdown(10)} ``` ## Passer des snippets aux composants [!VO]Passing snippets to components ### Propriétés explicites [!VO]Explicit props Au sein du template, les snippets sont des valeurs comme les autres. Ainsi, ils peuvent être passés aux composants en tant que props ([demo](/playground/untitled#H4sIAAAAAAAAE3VS247aMBD9lZGpBGwDASRegonaPvQL2qdlH5zYEKvBNvbQLbL875VzAcKyj3PmzJnLGU8UOwqSkd8KJdaCk4TsZS0cyV49wYuJuQiQpGd-N2bu_ooaI1YwJ57hpVYoFDqSEepKKw3mO7VDeTTaIvxiRS1gb_URxvO0ibrS8WanIrHUyiHs7Vmigy28RmyHHmKvDMbMmFq4cQInvGSwTsBYWYoMVhCSB2rBFFPsyl0uruTlR3JZCWvlTXl1Yy_mawiR_rbZKZrellJ-5JQ0RiBUgnFhJ9OGR7HKmwVoilXeIye8DOJGfYCgRlZ3iE876TBsZPX7hPdteO75PC4QaIo8vwNPePmANQ2fMeEFHrLD7rR1jTNkW986E8C3KwfwVr8HSHOSEBT_kGRozyIkn_zQveXDL3rIfPJHtUDwzShJd_Qk3gQCbOGLsdq4yfTRJopRuin3I7nv6kL7ARRjmLdBDG3uv1mhuLA3V2mKtqNEf_oCn8p9aN-WYqH5peP4kWBl1UwJzAEPT9U7K--0fRrrWnPTXpCm1_EVdXjpNmlA8G1hPPyM1fKgMqjFHjctXGjLhZ05w0qpDhksGrybuNEHtJnCalZWsuaTlfq6nPaaBSv_HKw-K57BjzOiVj9ZKQYKzQjZodYFqydYTRN4gPhVzTDO2xnma3HsVWjaLjT8nbfwHy7Q5f2dBAAA)) : ```svelte {#snippet header()} fruit qté prix total {/snippet} {#snippet row(d)} {d.name} {d.qty} {d.price} {d.qty * d.price} {/snippet} ``` On peut voir cette technique comme une façon de passer du contenu à un composant, plutôt que des données. Le concept est similaire à celui des slots pour les composants web. ### Propriétés implicites [!VO]Implicit props Pour simplifier l'écriture, les snippets déclarés directement _à l'intérieur_ d'un composant deviennent implicitement des props _sur_ le composant ([demo](/playground/untitled#H4sIAAAAAAAAE3VSTa_aMBD8Kyu_SkAbCA-JSzBR20N_QXt6vIMTO8SqsY29tI2s_PcqTiB8vaPHs7MzuxuIZgdBMvJLo0QlOElIJZXwJHsLBBvb_XUASc7Mb9Yu_B-hsMMK5sUzvDQahUZPMkJ96aTFfKd3KA_WOISfrFACKmcOMFmk8TWUTjY73RFLoz1C5U4SPWzhrcN2GKDrlcGEWauEnyRwxCaDdQLWyVJksII2uaMWTDPNLtzX5YX8-kgua-GcHJVXI3u5WEPb0d83O03TMZSmfRzOkG1Db7mNacOL19JagVALxoWbztq-H8U6j0SaYp2P2BGbOyQ2v8PQIFMXLKRDk177pq0zf6d8bMrzwBdd0pamyPMb-IjNEzS2f86Gz_Dwf-2F9nvNSUJQ_EOSoTuJNvngqK5v4Pas7n4-OCwlEEJcQTIMO-nSQwtb-GSdsX46e9gbRoP9yGQ11I0rEuycunu6PHx1QnPhxm3SFN15MOlYEFJZtf0dUywMbwZOeBGsrKNLYB54-1R9WNqVdki7usim6VmQphf7mnpshiQRhNAXdoOfMyX3OgMlKtz0cGEcF27uLSul3mewjPjgOOoDukxjPS9rqfh0pb-8zs6aBSt_7505aZ7B9xOi0T9YKW4UooVsr0zB1BTrWQJ3EL-oWcZ572GxFoezCk37QLe3897-B2i2U62uBAAA)) : ```svelte
{#snippet header()} {/snippet} {#snippet row(d)} {/snippet}
fruit qté prix total{d.name} {d.qty} {d.price} {d.qty * d.price}
``` ### Snippet `children` implicite [!VO]Implicit `children` snippet Tout contenu à l'intérieur d'une balise de composant qui n'est pas une déclaration de snippet fait implicitement partie du snippet `children` ([demo](/playground/untitled#H4sIAAAAAAAAE3WOQQrCMBBFrzIMggql3ddY1Du4si5sOmIwnYRkFKX07lKqglqX8_7_w2uRDw1hjlsWI5ZqTPBoLEXMdy3K3fdZDzB5Ndfep_FKVnpWHSKNce1YiCVijirqYLwUJQOYxrsgsLmIOIZjcA1M02w4n-PpomSVvTclqyEutDX6DA2pZ7_ABIVugrmEC3XJH92P55_G39GodCmWBFrQJ2PrQAwdLGHig_NxNv9xrQa1dhWIawrv1Wzeqawa8953D-8QOmaEAQAA)) : ```svelte ``` ```svelte ``` > [!NOTE] Notez que vous ne pouvez pas avoir une prop appelée `children` si vous avez également du > contenu au sein du composant — pour cette raison, vous devriez éviter de définir des props avec ce > nom. ### Propriétés de snippet optionnelles [!VO]Optional snippet props Vous pouvez déclarer des props de snippet comme étant optionnelles. Vous pouvez soit utiliser le chaînage optionnel pour ne rien afficher du tout si le snippet n'est pas défini... ```svelte {@render children?.()} ``` ... soit utiliser un bloc `#if` pour afficher du contenu par défaut : ```svelte {#if children} {@render children()} {:else} contenu par défaut {/if} ``` ## Typer les snippets [!VO]Typing snippets Les snippets implémentent l'interface `Snippet` importée depuis `'svelte'` : ```svelte ``` Avec ce changement, des petits gribouillis rouges vont apparaître si vous essayez d'utiliser le composant sans fournir une prop `data` et un snippet `row`. Notez que le type d'argument fourni à `Snippet` est un tuple, puisque les snippets peuvent avoir plusieurs paramètres. Nous pouvons restreindre encore un peu le typage en déclarant un générique, de sorte que `data` et `row` soient toujours du même type : ```svelte ``` ## Exporter des snippets [!VO]Exporting snippets Les snippets déclarés à la racine d'un fichier `.svelte` peuvent être exportés depuis un ` {#snippet add(a, b)} {a} + {b} = {a + b} {/snippet} ``` > [!NOTE] > Ceci nécessite Svelte 5.5.0 ou plus récent ## Snippets programmatiques [!VO]Programmatic snippets Les snippets peuvent être créés programmatiquement avec l'API [`createRawSnippet`](svelte#createRawSnippet). Cela ne concerne que des cas avancés. ## Snippets et slots [!VO]Snippets and slots En Svelte 4, du contenu peut être fourni aux composants en utilisant des [slots](legacy-slots). Les snippets sont plus puissants et plus polyvalents, de sorte que les slots sont dépréciés avec Svelte 5.