How to Create Reusable Components With Slots In Svelte?

8 minutes read

In Svelte, you can create reusable components with slots by using the <slot> element. Slots allow you to define placeholders where specific content can be inserted when using the component. This provides flexibility and customization options for components.


To create a reusable component with slots in Svelte, follow these steps:

  1. Define the component: Start by creating a new Svelte component file or editing an existing one. Inside the component, use the element to denote the area where the content will be inserted.
  2. Pass content to the slot: To insert content into the slot, use the component as if it were an HTML element with opening and closing tags. Place the content you want to pass into the component between these tags.
  3. Use the slot content: To display the passed content in the component, reference the element within the component's markup. You can style and manipulate the slot content just like any other element within the component.


By using slots, you can create highly reusable components that can be customized with unique content each time they are used. Components with slots are particularly useful when you want to provide a general structure or layout while allowing users to insert specific content within defined slots.

Best Svelte Books to Read in 2024

1
Svelte 3 Up and Running: A fast-paced introductory guide to building high-performance web applications with SvelteJS

Rating is 5 out of 5

Svelte 3 Up and Running: A fast-paced introductory guide to building high-performance web applications with SvelteJS

2
Svelte with Test-Driven Development: Advance your skills and write effective automated tests with Vitest, Playwright, and Cucumber.js

Rating is 4.9 out of 5

Svelte with Test-Driven Development: Advance your skills and write effective automated tests with Vitest, Playwright, and Cucumber.js

3
Svelte and Sapper in Action

Rating is 4.8 out of 5

Svelte and Sapper in Action

4
Svelte JS Book: Learn Svelte JS By Example

Rating is 4.7 out of 5

Svelte JS Book: Learn Svelte JS By Example

5
Beginning Svelte: Develop web applications with SvelteJS - a lightweight JavaScript compiler

Rating is 4.6 out of 5

Beginning Svelte: Develop web applications with SvelteJS - a lightweight JavaScript compiler


What is slot composition in Svelte?

In Svelte, slot composition refers to the process of combining multiple slots to generate a final output. Slots in Svelte allow components to define placeholders that can be filled with content by parents or consuming components.


Slot composition enables dynamic content insertion into a component by allowing the parent component or the component consuming the current component to provide content to the slots defined within it. This allows for greater flexibility and reusability of components, as different content can be inserted into the same component based on the use case.


To achieve slot composition, Svelte uses the <slot> element, which acts as a placeholder within a component. The parent or consuming component can then provide content to this slot using the <slot> element with a specific name. By using multiple slots with different names within a component, different sections can be dynamically composed to form the final output.


Here's an example of slot composition in Svelte:

1
2
3
4
5
6
7
<!-- Child.svelte -->
<div>
  <h2>Child Component</h2>
  <slot name="header">Default header content</slot>
  <p>This is the child component's content.</p>
  <slot name="footer">Default footer content</slot>
</div>


1
2
3
4
5
6
7
8
9
<!-- Parent.svelte -->
<script>
  import Child from './Child.svelte';
</script>

<Child>
  <span slot="header">Header content provided by parent</span>
  <button slot="footer">Footer content provided by parent</button>
</Child>


In this example, the Child component defines two slots named "header" and "footer". The parent component (Parent.svelte) fills these slots by passing content using the slot attribute with the respective slot names. The final output combines the child component's static content with the dynamically composed content provided by the parent, resulting in a flexible and configurable component.


How to conditionally render content inside a slot in Svelte?

In Svelte, you can conditionally render content inside a slot by utilizing the {#if} block. Here's an example:


Parent.svelte:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
<script>
  import { createEventDispatcher } from 'svelte';

  const dispatch = createEventDispatcher();

  let condition = true;

  // Function to toggle the condition
  function toggleCondition() {
    condition = !condition;
  }
</script>

<button on:click={toggleCondition}>Toggle Condition</button> 
<Child>
  {#if condition}
    <p>Rendered when condition is true</p>
  {/if}
</Child>


Child.svelte:

1
2
3
4
5
6
7
8
9
<script>
  import { createEventDispatcher } from 'svelte';

  const dispatch = createEventDispatcher();
</script>

<div>
  <slot></slot>
</div>


In the above code, the Parent.svelte component has a boolean variable condition which is initially set to true. On clicking the "Toggle Condition" button, the toggleCondition function is triggered which toggles the condition variable.


Inside the Child.svelte component, the content of the slot is rendered using the <slot></slot> tags. But, by placing the content inside the {#if} block, we can conditionally render it based on the value of condition.


So, when the condition is true, the content inside the slot (i.e., <p>Rendered when condition is true</p>) will be rendered. But if the condition is false, the content will not be rendered.


Now, whenever the "Toggle Condition" button is clicked, the content inside the slot will be conditionally rendered based on the updated value of condition.


How to compose slots in Svelte components?

In Svelte, you can compose slots in components using the <slot> element. The <slot> element acts as a placeholder for content that can be provided when using the component. Here's how you can compose slots in Svelte components:


Step 1: Create a Svelte component

1
2
3
4
// Button.svelte
<button>
  <slot></slot>
</button>


Step 2: Use the component and provide content for the slot

1
2
3
4
5
6
7
8
// App.svelte
<script>
  import Button from './Button.svelte';
</script>

<Button>
  Submit
</Button>


In the above example, the <Button> component has a slot defined with <slot></slot>. Any content placed within the <Button> tags will replace the <slot> element. So in this case, the word "Submit" will appear inside the button.


You can provide default content for the slot by placing it within the <slot> element, like this:

1
2
3
<button>
  <slot>Default Text</slot>
</button>


If the slot is left empty, the default content will be displayed. But if content is provided when using the component, it will replace the default content.


You can also have named slots by providing a name attribute to the <slot> element and specifying the slot name when using the component, like this:

1
2
3
4
// Button.svelte
<button>
  <slot name="custom"></slot>
</button>


1
2
3
4
// App.svelte
<Button>
  <span slot="custom">Submit</span>
</Button>


In this case, the content with the slot="custom" attribute will replace the <slot name="custom"> element in the component.

Facebook Twitter LinkedIn Telegram

Related Posts:

To implement lazy loading for components in Svelte, you can follow these steps:First, you need to install the svelte-lazy package using npm or yarn: npm install svelte-lazy Once installed, you can import the Lazy component from svelte-lazy and use it in your S...
Building a Svelte component library involves creating reusable components that can be easily imported and used in different projects. To get started, you first need to decide on the components you want to include in your library and organize them into separate...
To create a basic Svelte component, you need to follow these steps:Set up a new Svelte project or navigate to an existing project directory.Identify the purpose of your component and decide on its structure, functionality, and styling.Create a new Svelte compo...