Vue.js Slots
What are slots in Vue.js?
Slots in Vue.js are a powerful feature that allows developers to create reusable components with flexible content distribution. They serve as placeholders in a component's template where the parent component can insert custom content.
How do you define a slot in a Vue component?
You can define a slot in a Vue component by using the <slot> element in the component's template. This marks where the parent component's content will be injected.
Vue.component('my-component', {
template: `
<div class="my-component">
<h1>Header</h1>
<slot></slot>
<footer>Footer</footer>
</div>
`
});
How do you use slots in a parent component?
To use slots in a parent component, you simply wrap the desired content in the custom component tags. The content will be injected into the slot defined in the child component.
const app = new Vue({
el: '#app',
template: `
<my-component>
<p>This content will be injected into the slot.</p>
</my-component>
`
});
What is a named slot in Vue.js?
A named slot allows you to define multiple slots in a component with unique names. This enables the parent component to specify which content goes into which slot by using the v-slot directive or the # shorthand.
Vue.component('my-component', {
template: `
<div>
<slot name="header"></slot>
<slot></slot>
<slot name="footer"></slot>
</div>
`
});
// Parent component
const app = new Vue({
el: '#app',
template: `
<my-component>
<template v-slot:header>
<h1>This is the header</h1>
<p>This is the default slot content.</p>
<template v-slot:footer>
<p>This is the footer</p>
</template>
</my-component>
`
});
How do you use scoped slots in Vue.js?
Scoped slots allow you to pass data from a child component back to the parent component. This is done by defining a slot that exposes properties to the parent via the slot-scope attribute.
Vue.component('my-list', {
template: `
<ul>
<li v-for="item in items" :key="item.id">
<slot :item="item"></slot>
</li>
</ul>
`,
data() {
return {
items: [{ id: 1, text: 'Item 1' }, { id: 2, text: 'Item 2' }]
};
}
});
// Parent component
const app = new Vue({
el: '#app',
template: `
<my-list>
<template v-slot="{ item }">
<li>{{ item.text }}</li>
</template>
</my-list>
`
});
What is the difference between default slots and named slots?
Default slots are used to render a single block of content within a component, while named slots allow you to have multiple slots within a component, each designated for specific content. Named slots can help organize complex layouts where different types of content need to be injected in various locations.
Vue.component('my-component', {
template: `
<div>
<slot name="header"></slot>
<slot></slot>
<slot name="footer"></slot>
</div>
`
});
How do you handle slot content dynamically in Vue.js?
You can handle slot content dynamically by using conditional rendering with v-if or v-for within the slots. This allows you to control which content is displayed based on the component's state.
Vue.component('dynamic-component', {
template: `
<div>
<slot v-if="isVisible"></slot>
<button @click="toggle">Toggle Slot</button>
</div>
`,
data() {
return {
isVisible: true
};
},
methods: {
toggle() {
this.isVisible = !this.isVisible;
}
}
});
// Parent component
const app = new Vue({
el: '#app',
template: `
<dynamic-component>
<p>This content is conditionally rendered in the slot.</p>
</dynamic-component>
`
});
What are the benefits of using slots in Vue.js?
Using slots in Vue.js provides several benefits:
- Flexibility: Allows for more flexible component design by enabling the injection of dynamic content.
- Reusability: Promotes reusability of components as they can be easily customized by providing different content.
- Encapsulation: Keeps the component structure clean by encapsulating the logic while allowing for custom content to be injected.
- Scoped Data: Enables passing data from child to parent components through scoped slots, enhancing the data flow between components.