Что такое scoped slots во Vue

Ответ

Scoped slots в Vue позволяют передавать данные из дочернего компонента в слот родительского компонента. Это полезно, когда нужно кастомизировать отображение данных внутри слота.

Пример:

<!-- Дочерний компонент -->
<template>
  <div>
    <slot :item="item" :index="index"></slot>
  </div>
</template>

<script>
export default {
  data() {
    return {
      item: { name: 'Vue' },
      index: 1
    }
  }
}
</script>

<!-- Родительский компонент -->
<child-component>
  <template v-slot:default="slotProps">
    {{ slotProps.item.name }} - {{ slotProps.index }}
  </template>
</child-component>

Ключевые моменты:

  • Данные передаются через атрибуты в <slot>
  • В родителе доступ через v-slot (можно сократить до #default)
  • Можно деструктурировать props: v-slot="{ item, index }"
  • Позволяет создавать гибкие компоненты (например, для таблиц, списков)

Ответ 18+ 🔞

А, ну это ж про те самые слоты с данными, которые из дочернего компонента в родительский прокидывают! Штука, блядь, мощная, когда нужно не просто дыру в разметке оставить, а туда ещё и инфу подсунуть.

Смотри, как это работает, ёпта. Внутри своего компонента ты объявляешь обычный <slot>, но, сука, не пустой, а с прицепом — вешаешь на него атрибуты с данными, которые хочешь наружу вывалить.

<!-- Твой компонент-поставщик -->
<template>
  <div>
    <slot :item="item" :index="index"></slot>
  </div>
</template>

<script>
export default {
  data() {
    return {
      item: { name: 'Vue' },
      index: 1
    }
  }
}
</script>

Вот этот :item="item" — это и есть, блядь, тот самый волшебный пендель, которым ты данные из своей локальной кухни вышвыриваешь наружу.

А теперь, внимание, хитрая жопа начинается на стороне того, кто твой компонент использует. Там нужно эти летящие на голову данные поймать.

<!-- Тот, кто твой компонент юзает -->
<child-component>
  <template v-slot:default="slotProps">
    {{ slotProps.item.name }} - {{ slotProps.index }}
  </template>
</child-component>

Смотри, что происходит: ты объявляешь v-slot:default и даёшь ему какую-нибудь переменную (тут slotProps). В эту переменную, блядь, Vue аккуратненько складывает ВСЕ атрибуты, которые ты на слот навесил в дочернем компоненте. Получается такой объект { item: {...}, index: 1 }. И потом уже из него всё вытаскиваешь.

Но это ещё не всё, ёпта! Чтобы не писать каждый раз slotProps.что-то-там, можно сразу на месте всё разобрать, как чемодан на таможне.

<child-component>
  <template #default="{ item, index }">
    {{ item.name }} - {{ index }}
  </template>
</child-component>

Видал? #default — это короткая запись того же v-slot:default. А { item, index } — это деструктуризация, прямо как в обычном JavaScript. Красота, блядь, одним махом распаковал и сразу по полочкам разложил.

Где эта хуйня реально выстреливает? Да где угодно, где логика отделена от внешнего вида! Таблицы, списки, карточки — делаешь умный компонент, который данные готовит и логику обрабатывает, а как это всё нарисовать — отдаёшь на откуп тому, кто твой компонент вызывает. Гибридная хуйня получается, овердохуища гибкая.