Converting Slots to Snippets

+15 Mana ✨

Svelte 5 replaces <slot> with snippets for component composition.

Default Slot

svelte
<!-- Svelte 4: Component -->
<div class="card">
  <slot />
</div>

<!-- Svelte 4: Usage -->
<Card>Content here</Card>
svelte
<!-- Svelte 5: Component -->
<script>
  let { children } = $props();
</script>

<div class="card">
  {@render children()}
</div>

<!-- Svelte 5: Usage -->
<Card>Content here</Card>

Named Slots

svelte
<!-- Svelte 4: Component -->
<header><slot name="header" /></header>
<main><slot /></main>
<footer><slot name="footer" /></footer>

<!-- Svelte 4: Usage -->
<Layout>
  <h1 slot="header">Title</h1>
  <p>Main content</p>
  <p slot="footer">Footer</p>
</Layout>
svelte
<!-- Svelte 5: Component -->
<script>
  let { header, children, footer } = $props();
</script>

<header>{@render header?.()}</header>
<main>{@render children()}</main>
<footer>{@render footer?.()}</footer>

<!-- Svelte 5: Usage -->
<Layout>
  {#snippet header()}
    <h1>Title</h1>
  {/snippet}
  
  <p>Main content</p>
  
  {#snippet footer()}
    <p>Footer</p>
  {/snippet}
</Layout>

Slot Props (Passing Data Back)

svelte
<!-- Svelte 4 -->
<slot item={currentItem} index={i} />

<!-- Usage -->
<List let:item let:index>
  <div>{index}: {item.name}</div>
</List>
svelte
<!-- Svelte 5: Component -->
<script>
  let { children } = $props();
</script>

{#each items as item, index}
  {@render children(item, index)}
{/each}

<!-- Svelte 5: Usage -->
<List>
  {#snippet children(item, index)}
    <div>{index}: {item.name}</div>
  {/snippet}
</List>

šŸ“– Snippets documentation

āœ“ Completed