Understanding Vue.js Slots
May 13, 2019
Slots allow you to embed arbitrary content in a Vue component. Slots are the Vue equivalent to transclusion in Angular and child props in React.
For example, suppose you wanted a component called green
that added a green background behind child content. Here's an example of such a component using slots.
Vue.component('green', {
// The `<slot></slot>` part will be replaced with child content.
template: `
<div style="background-color: #00ff00">
<slot></slot>
</div>
`
});
const app = new Vue({
// The `<h1>` is the child content.
template: `
<green>
<h1>Hello, World!</h1>
</green>
`
});
You can also define default inner HTML. If there's no inner HTML underneath <green></green>
, Vue will use the inner HTML of <slot></slot>
as shown below.
Vue.component('green', {
// The inner HTML of `<slot></slot>` is the default.
template: `
<div style="background-color: #00ff00">
<slot>
<h2>Hello, World!</h2>
</slot>
</div>
`
});
const app = new Vue({
// No inner HTML
template: `<green></green>`
});
Named Slots
Sometimes you need multiple slots. For example, suppose you're writing a brand
component that has two slots, 'name' and 'logo'.
Vue.component('brand', {
// 2 slots named 'logo' and 'name'.
template: `
<div class="brand">
<div class="logo">
<slot name="logo"></slot>
</div>
<div class="name">
<a href="/">
<slot name="name"></slot>
</a>
</div>
</div>
`
});
const app = new Vue({
// `template v-slot:name` is how you insert content into a slot named
// 'name'
template: `
<brand>
<template v-slot:logo>
<img src="https://masteringjs.io/assets/logo.png">
</template>
<template v-slot:name>
Mastering JS
</template>
</brand>
`
});
The output HTML looks like this:
<div data-server-rendered="true" class="brand">
<div class="logo">
<img src="https://masteringjs.io/assets/logo.png">
</div>
<div class="name">
<a href="/">
Mastering JS
</a>
</div>
</div>
Here's the rendered HTML:
Vue School has some of our favorite Vue
video courses. Their Vue.js Master Class walks you through building a real
world application, and does a great job of teaching you how to integrate Vue
with Firebase.
Check it out!
Did you find this tutorial useful? Say thanks by starring our repo on GitHub!