In Vue.js, v-slot is a directive used to define how content is inserted into and displayed within the slots of a child component, particularly for specifying how template content is placed into slots when using components. This directive was introduced in Vue 2.6 to replace the previous slot and slot-scope attributes, providing a more consistent and intuitive way to handle slot content.
v-slot Basic Usage:
v-slot is used to define how template content is inserted into and displayed within different slots of a child component. For example, if you have a BaseLayout component with header and footer slots, you can use v-slot as follows:
vue<BaseLayout> <template v-slot:header> <h1>This is the header</h1> </template> <template v-slot:footer> <p>This is the footer</p> </template> </BaseLayout>
v-slot Variants:
-
Default Slot Abbreviation: If you only need to use the default slot, you can use the shorthand
#instead ofv-slot. For example:vue<BaseLayout> <template #default> <p>Default content</p> </template> </BaseLayout>Or more simply, if you're only inserting content for the default slot, you can omit the template:
vue<BaseLayout> <p>Default content</p> </BaseLayout> -
Named Slots: As shown in the previous example, you can specify names for slots (such as
headerorfooter). This allows you to define multiple slots within a component and ensure content is inserted correctly. -
Scoped Slots:
v-slotcan also be used for scoped slots, where the child component passes data to the slot content. This is particularly useful for reusable components with dynamic data. For example:vue<DataFetcher> <template v-slot:default="slotProps"> <div>Data: {{ slotProps.data }}</div> </template> </DataFetcher>In this example, the
DataFetchercomponent fetches data from an API and passes it through the slot, withslotPropscarrying the data.
Usage Scenario Example:
Suppose you are developing a task list application with a TaskList component where each task should be displayed with different styles. You can use scoped slots to achieve this:
vue<TaskList> <template v-slot:default="slotProps"> <div :class="{'high-priority': slotProps.task.priority > 3}"> <p>{{ slotProps.task.description }}</p> </div> </template> </TaskList>
In this example, the TaskList component passes the task object as slot props to the slot content, allowing you to dynamically adjust styles based on the task's properties.
In summary, v-slot is a powerful directive that enables developers to have high flexibility in controlling how and where content is displayed, particularly when building reusable and flexible component interfaces.