Skip to content

Snippets & Children

React passes UI content to components via children (JSX between tags) or render props (functions that return JSX). Svelte 5 replaces the old <slot> system with snippets — reusable, named, parameterized template fragments defined with {#snippet} and rendered with {@render}. The default snippet is still called children, so basic usage feels immediately familiar.

React
// Card.jsx
function Card({ children }) {
return <div className="card">{children}</div>;
}
// Usage:
<Card>
<p>Hello from inside!</p>
</Card>
Svelte
<!-- Card.svelte -->
<script>
let { children } = $props();
</script>
<div class="card">
{@render children()}
</div>
<!-- Usage in parent: -->
<!-- <Card><p>Hello from inside!</p></Card> -->

The children prop is a snippet function — you must call it with {@render children()}. React’s {children} is a value; Svelte’s children is a callable snippet.

Named snippets (like named slots / render props)

Section titled “Named snippets (like named slots / render props)”
React
// Dialog.jsx
function Dialog({ header, body, footer }) {
return (
<div className="dialog">
<div className="dialog-header">{header}</div>
<div className="dialog-body">{body}</div>
<div className="dialog-footer">{footer}</div>
</div>
);
}
// Usage:
<Dialog
header={<h2>Confirm</h2>}
body={<p>Are you sure?</p>}
footer={<button>OK</button>}
/>
Svelte
<!-- Dialog.svelte -->
<script>
let { header, body, footer } = $props();
</script>
<div class="dialog">
<div class="dialog-header">{@render header()}</div>
<div class="dialog-body">{@render body()}</div>
<div class="dialog-footer">{@render footer()}</div>
</div>
<!-- Usage in parent: -->
<!--
<Dialog>
{#snippet header()}<h2>Confirm</h2>{/snippet}
{#snippet body()}<p>Are you sure?</p>{/snippet}
{#snippet footer()}<button>OK</button>{/snippet}
</Dialog>
-->

Snippets with parameters (render props pattern)

Section titled “Snippets with parameters (render props pattern)”

Snippets can receive arguments — this replaces the React render-prop pattern cleanly:

React
// List.jsx
function List({ items, renderItem }) {
return (
<ul>
{items.map((item, i) => (
<li key={i}>{renderItem(item)}</li>
))}
</ul>
);
}
// Usage:
<List
items={fruits}
renderItem={fruit => <strong>{fruit}</strong>}
/>
Svelte
<!-- List.svelte -->
<script>
let { items, renderItem } = $props();
</script>
<ul>
{#each items as item}
<li>{@render renderItem(item)}</li>
{/each}
</ul>
<!-- Usage in parent:
<List {items}>
{#snippet renderItem(fruit)}
<strong>{fruit}</strong>
{/snippet}
</List>
-->
How do you render the default children in a Svelte 5 component?
What is the Svelte 5 syntax for defining a reusable template fragment with parameters?
What replaced Svelte 4 named slots in Svelte 5?