Nesting Components With Slots in Svelte
- 2 minutes read
In Svelte, you can use slots to nest components together.
Consider the following Container.svelte component:
<!-- Container.svelte -->
<div class="container">
<slot />
</div>
<style>
.container {
align-items: center;
display: flex;
justify-content: center;
}
</style>
By including Svelte’s native <slot /> element (which can also be represented by <slot></slot>) in our component, we can nest an external component inside that slot.
For example, consider the following Item.svelte component, which inherits Container.svelte:
<!-- Item.svelte -->
<script>
import Container from './Container.svelte';
</script>
<Container>
<p>This text will be centered inside the container.</p>
</Container>
The code inside the <Container> element in Item.svelte will be nested within the <slot /> element in Container.svelte.
Providing fallbacks for empty slots
If no slot is passed to our Container.svelte component, then an error will be thrown. If we want to handle this error, we can provide a default fallback child of the <slot> element:
<!-- Container.svelte -->
<div class="container">
<slot>
<p>This is some default text that will appear if no nested code is provided.</p>
</slot>
</div>
Nesting data within multiple slots
We can also use multiple slots by adding a name attribute to our <slot> elements:
<!-- Container.svelte -->
<div class="container">
<slot name="title" />
<slot name="description" />
</div>
In this example, we can access those slots from Item.svelte by specifying a slot attribute on the code we pass to the Container element:
<!-- Item.svelte -->
<Container>
<p slot="title">Title</p>
<p slot="description">Description</p>
</Container>
Conclusion
The <slot> element in Svelte is very powerful, and there is actually a lot more you can do with it.
This tutorial simply encompasses the more basic component nesting features in Svelte, and I use derivations of most of these snippets regularly.
I hope you found it useful!