Що таке scoped slot?
Scoped slot - це слот, який дозволяє передавати дані з дочірнього компонента в батьківський, разом із розміткою.
Простіше кажучи:
Scoped slot - це слот із доступом до даних дитини. Дитина «ділиться» своїми даними, а батько вирішує, як ці дані відрендерити.
Це робить компонент гнучкішим і дозволяє реалізовувати патерн «render props».
Класична проблема, яку вирішують scoped slots
Звичайний слот передає лише розмітку від батька -> до дитини.
Але іноді потрібно навпаки:
- дитина знає дані
- але батько має вирішити як їх відображати
Наприклад:
- компонент списку передає кожен елемент списку
- батько вирішує, як кожен елемент оформити
Звичайні слоти цього не дозволяють.
Як працює scoped slot?
Дочірній компонент передає дані в слот через props:
<!-- Child.vue -->
<template>
<slot :user="user"></slot>
</template>user - це дані в дочірньому компоненті.
Батько отримує дані через v-slot
<!-- Parent.vue -->
<Child v-slot="{ user }">
<p>{{ user.name }}</p>
</Child>Батько отримує об'єкт { user }, який прийшов від дитини.
Приклад: список зі scoped slot
Дочірній компонент:
<!-- ItemList.vue -->
<template>
<ul>
<li v-for="item in items" :key="item.id">
<slot :item="item"></slot>
</li>
</ul>
</template>
<script>
export default {
props: ['items']
}
</script>Батьківський компонент:
<ItemList :items="products" v-slot="{ item }">
<strong>{{ item.title }}</strong> - {{ item.price }}$
</ItemList>Батько вирішує, як відображати item, хоча дані перебувають у дочірньому компоненті.
Навіщо потрібні scoped slots?
1. Передача даних із дочірнього в батьківський
Звичайні слоти передають лише розмітку - scoped slots передають ще й props.
2. Гнучкість відображення
Батько може повністю контролювати рендеринг даних.
3. Створення універсальних компонентів
Наприклад:
- універсальний список
- таблиця
- dropdown
- карусель
- сітка карток
Компонент надає дані, батько - дизайн.
4. Патерн «Render Props»
Scoped slots - це Vue-реалізація render props із React.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.