layouts
Включение лейаутов
Лейауты подключаются добавлением <NuxtLayout> в app.vue:
<template>
<NuxtLayout>
<NuxtPage />
</NuxtLayout>
</template>
Чтобы использовать лейаут:
- Задайте свойство
layoutна странице через definePageMeta. - Установите свойство
nameдля<NuxtLayout>. - Задайте свойство
appLayoutв правилах маршрутов (route rules).
someLayout становится some-layout.layouts/default.vue.app.vue вместо отдельного каталога layouts/.<slot />.Лейаут по умолчанию
Добавьте ~/layouts/default.vue:
<template>
<div>
<p>Некоторый контент лейаута по умолчанию, общий для всех страниц</p>
<slot />
</div>
</template>
В файле лейаута содержимое страницы будет отображаться в компоненте <slot />.
Именованный лейаут
-| layouts/
---| default.vue
---| custom.vue
Затем вы можете использовать лейаут custom на своей странице:
<script setup lang="ts">
declare module 'nuxt/app' {
interface NuxtLayouts {
'custom': unknown
}
}
// ---cut---
definePageMeta({
layout: 'custom',
})
</script>
Вы можете напрямую переопределить лейаут по умолчанию для всех страниц, используя свойство name <NuxtLayout>:
<script setup lang="ts">
// Вы можете сделать выбор на основе вызова API или статуса входа в систему.
const layout = 'custom'
</script>
<template>
<NuxtLayout :name="layout">
<NuxtPage />
</NuxtLayout>
</template>
Если у вас есть лейаут во вложенных директориях, имя лейаута будет основано на пути к нему и имени файла, при этом дублирующиеся сегменты будут удалены.
| Файл | Имя лейаута |
|---|---|
~/layouts/desktop/default.vue | desktop-default |
~/layouts/desktop-base/base.vue | desktop-base |
~/layouts/desktop/index.vue | desktop |
Для ясности мы рекомендуем, чтобы имя файла лейаута совпадало с его именем:
| Файл | Имя лейаута |
|---|---|
~/layouts/desktop/DesktopDefault.vue | desktop-default |
~/layouts/desktop-base/DesktopBase.vue | desktop-base |
~/layouts/desktop/Desktop.vue | desktop |
Динамическое изменение лейаута
Вы также можете использовать хелпер setPageLayout для динамического изменения лейаута:
<script setup lang="ts">
declare module 'nuxt/app' {
interface NuxtLayouts {
'custom': unknown
}
}
// ---cut---
function enableCustomLayout () {
setPageLayout('custom')
}
definePageMeta({
layout: false,
})
</script>
<template>
<div>
<button @click="enableCustomLayout">
Обновить лейаут
</button>
</div>
</template>
Лейауты для отдельных маршрутов можно задать через свойство appLayout в правилах маршрутов:
export default defineNuxtConfig({
routeRules: {
// Лейаут для конкретного маршрута
'/admin': { appLayout: 'admin' },
// Лейаут для нескольких маршрутов
'/dashboard/**': { appLayout: 'dashboard' },
// Отключить лейаут для маршрута
'/landing': { appLayout: false },
},
})
Переопределение лейаута на постраничной основе
Если вы используете страницы, вы можете получить полный контроль, установив layout: false, а затем используя компонент <NuxtLayout> на странице.
<script setup lang="ts">
definePageMeta({
layout: false,
})
</script>
<template>
<div>
<NuxtLayout name="custom">
<template #header>
Некоторое содержимое шаблона заголовка.
</template>
Остальная часть страницы
</NuxtLayout>
</div>
</template>
<template>
<div>
<header>
<slot name="header">
Содержимое заголовка по умолчанию
</slot>
</header>
<main>
<slot />
</main>
</div>
</template>
<NuxtLayout> на своих страницах, убедитесь, что он не является корневым элементом (или отключите лейаут/переходы страниц).