Що таке слот у Vue?
Слот (slot) у Vue - це механізм, який дозволяє передавати внутрішній контент (HTML або інші компоненти) від батька в дочірній компонент.
Простіше кажучи: Слот - це "місце всередині компонента", куди батько може вставити свою розмітку.
Слоти роблять компоненти гнучкими і придатними для повторного використання.
Простий приклад слота
Компонент Card.vue:
<template>
<div class="card">
<slot></slot>
</div>
</template>Використання:
<Card>
<h1>Hello Vue</h1>
<p>This is card content</p>
</Card>Результат: компонент обгортає передану розмітку.
Навіщо потрібні слоти?
- розмітка всередині компонента може змінюватися
- компонент стає універсальним
- можна створювати гнучкі UI-обгортки: Card, Modal, Layout, Table, Tabs
- це основа просунутих компонентних патернів
Типи слотів
1) Звичайний слот (default slot)
<slot></slot>Використовується, коли у компонента просто одне місце для вмісту.
2) Іменовані слоти
Якщо потрібно кілька різних областей всередині компонента.
Компонент Modal.vue:
<template>
<div class="modal">
<header><slot name="header"></slot></header>
<main><slot></slot></main>
<footer><slot name="footer"></slot></footer>
</div>
</template>Використання:
<Modal>
<template #header>
<h1>Title</h1>
</template>
Modal content
<template #footer>
<button>OK</button>
</template>
</Modal>3) Скоуп-слоти (scoped)
Це слоти, які отримують дані від дочірнього компонента.
Дочірній компонент:
<template>
<slot :user="user"></slot>
</template>
<script setup>
const user = { name: 'Tim', age: 28 }
</script>Батько:
<MyComponent>
<template #default="{ user }">
<p>{{ user.name }} - {{ user.age }}</p>
</template>
</MyComponent>Це потужний інструмент для таблиць, списків, форм, UI-патернів.
Що можна передати в слот?
- HTML
- текст
- будь-які Vue-компоненти
- складні шаблони
- реактивні дані (у scoped-слотах)
Де часто використовують слоти?
- Layout (
<Header /><Sidebar />) - Картки (
<Card>...</Card>) - Модальні вікна
- Таблиці, списки
- Компоненти-обгортки
- Випадні списки
- Dropdown/Popover/Menu
- Tabs
- Form builder - динамічні форми
Приклад реального компонента Card зі слотом
<template>
<div class="card">
<slot />
</div>
</template>
<style scoped>
.card {
padding: 20px;
background: white;
border-radius: 8px;
}
</style>Використання:
<Card>
<h2>Product Name</h2>
<p>Description...</p>
</Card>Підсумок (шпаргалка)
Слот - це місце в компоненті, куди батько може передати свою розмітку.
Види слотів:
- Звичайний
- Іменований
- Scoped (слот з даними)
Слоти дозволяють будувати гнучкі, придатні для повторного використання компоненти і реалізовувати складні UI-патерни.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.