Назад к вопросам
Middle
72
questionbank

Для чего в Vue используются слоты и как они работают?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Слоты во Vue используются для внедрения контента в компоненты извне. Это позволяет создавать гибкие и переиспользуемые компоненты.

Есть три типа слотов:

  • Слоты по умолчанию (Default Slots): Используются для вставки основного контента.

    <template>
      <div>
        <slot></slot>
      </div>
    </template>
    

    Использование:

    <my-component>
      <p>Этот контент будет вставлен в слот по умолчанию.</p>
    </my-component>
    
  • Именованные слоты (Named Slots): Позволяют вставлять контент в конкретные слоты внутри компонента, отличающиеся по имени.

    <template>
      <div>
        <slot name="header"></slot>
        <div>Основной контент компонента</div>
        <slot name="footer"></slot>
      </div>
    </template>
    

    Использование:

    <my-component>
      <template v-slot:header>
        <h2>Заголовок</h2>
      </template>
      <template v-slot:footer>
        <p>Футер</p>
      </template>
    </my-component>
    

    Сокращенный синтаксис для v-slot:

    <my-component>
      <template #header>
        <h2>Заголовок (сокращенный синтаксис)</h2>
      </template>
    </my-component>
    
  • Слоты с ограниченной областью видимости (Scoped Slots): Позволяют дочернему компоненту передавать данные родительскому компоненту через слот. Родительский компонент может использовать эти данные при рендеринге контента слота.

    <template>
      <ul>
        <li v-for="item in items" :key="item.id">
          <slot :item="item" :index="index"></slot>
        </li>
      </ul>
    </template>
    
    

    Использование:

    <my-list :items="['Apple', 'Banana', 'Orange']">
      <template v-slot:default="slotProps">
        {{ slotProps.index + 1 }}. {{ slotProps.item }}
      </template>
    </my-list>
    
    

    Деструктуризация slotProps:

    <my-list :items="['Apple', 'Banana', 'Orange']">
      <template v-slot="{ item, index }">
        {{ index + 1 }}. {{ item }} (Деструктуризация)
      </template>
    </my-list>
    

Слоты работают, создавая "места" внутри шаблона дочернего компонента, куда родитель может вставить свой собственный контент. При рендеринге, Vue заменяет тег <slot> (или <slot name="...">) на контент, предоставленный родительским компонентом. В случае scoped slots, данные из дочернего компонента доступны через объект аргумента шаблона слота в родительском компоненте.