Компоненты не передаются в слот?

Как правильно отрисовать компоненты, передаваемые в слоты, которые находятся в файле app/layouts/default.vue, в файле pages/index.vue? Обратите внимание, что если я вызываю эти компоненты вне блока template, они отображаются корректно.
  • 13 апреля 2025 г. 11:35
Ответы на вопрос 2
В Nuxt.js для правильной работы компонентов, передаваемых в слоты, важно убедиться, что вы правильно используете слоты и контекст внутри файлов вашего приложения.

Если у вас есть компоненты, которые вы хотите передать в слот определенного компонента (например, в `default.vue`), вы можете использовать синтаксис `<slot>` для их отображения.

1. **Компонент `default.vue` (например, в папке `layouts`)**:

```vue
<template>
  <div>
    <header>
      <h1>Header Area</h1>
    </header>
    <main>
      <slot></slot> <!-- Здесь будет отображаться содержимое слота -->
    </main>
    <footer>
      <p>Footer Area</p>
    </footer>
  </div>
</template>

<script>
export default {
  layout: 'default' // Опционально, если вы используете только этот макет
}
</script>
```

2. **Страница `index.vue` (например, в папке `pages`)**:

```vue
<template>
  <div>
    <h2>Home Page</h2>
    <!-- Передаем содержимое в слот компонента default.vue -->
    <NuxtChild>
      <p>This content is passed as a slot!</p>
    </NuxtChild>
  </div>
</template>

<script>
export default {
  layout: 'default' // Указываем, что хотим использовать layout
}
</script>
```

### Обратите внимание:
- Важно, чтобы `<slot></slot>` в `default.vue` находился внутри блока `<template>` и чтобы он был корректно использован в `index.vue`.
- В Nuxt.js, если вы используете `pages/index.vue`, вам не нужно дополнительно вставлять `<NuxtChild>` для простого отображения содержимого, так как Nuxt автоматически рендерит главную страницу в место, определенное слотом в layout. 

Если вы хотите передать конкретные компоненты дополнительно, можно использовать именованные слоты:

3. **Пример именованного слота**:

```vue
<!-- default.vue -->
<template>
  <div>
    <header>
      <h1>Header Area</h1>
    </header>
    <main>
      <slot name="content"></slot> <!-- Именованный слот -->
    </main>
    <footer>
      <p>Footer Area</p>
    </footer>
  </div>
</template>

<script>
export default {
  layout: 'default'
}
</script>
```

```vue
<!-- index.vue -->
<template>
  <div>
    <h2>Home Page</h2>
    <!-- Используем именованный слот -->
    <template v-slot:content>
      <p>This content is passed as a named slot!</p>
    </template>
  </div>
</template>

<script>
export default {
  layout: 'default'
}
</script>
```

Теперь при рендеринге `index.vue` содержимое, переданное в именованный слот `content`, будет отображаться в `main` области вашего `default.vue`.
Чтобы передавать слоты для NuxtLayout нужно прописать название компонента с этим лэйаутом, возможно это баг самого Nuxt. 

Пример страницы
<script lang="ts" setup>
definePageMeta({
  layout: false,
});
</script>

<template>
  <NuxtLayout name="default">
    <template #header> Header slot from page </template>
    <b> Index page </b>
  </NuxtLayout>
</template>


Полное демо
Похожие вопросы