Лейаут
Nuxt Kit предоставляет утилиты для регистрации лейаутов из модулей.
Лейаут — обёртка вокруг страниц: общий каркас из повторяющихся блоков (шапка, подвал и т.д.). Зарегистрировать лейаут из модуля можно через addLayout.
addLayout
Регистрирует шаблон как именованный лейаут приложения.
В Nuxt 2 лейаут
error также может быть зарегистрирован с помощью этой утилиты. В Nuxt 3+ лейаут errorзаменён на страницу error.vue в корне проекта.Использование
import { addLayout, createResolver, defineNuxtModule } from '@nuxt/kit'
export default defineNuxtModule({
setup () {
const { resolve } = createResolver(import.meta.url)
addLayout({
src: resolve('templates/custom-layout.ts'),
filename: 'custom-layout.ts',
}, 'custom')
},
})
Тип
function addLayout (layout: NuxtTemplate | string, name: string): void
Параметры
layout: объект шаблона или строка с путём к шаблону. Строка превращается в объект с полем src. У объекта шаблона возможны поля:
| Свойство | Тип | Обязательно | Описание |
|---|---|---|---|
src | string | false | Путь к шаблону. Если нет src, нужен getContents. |
filename | string | false | Имя файла шаблона. Если не задано, выводится из src (тогда src обязателен). |
dst | string | false | Путь назначения. Если не задан, строится из filename и buildDir Nuxt. |
options | Record<string, any> | false | Опции, передаваемые в шаблон. |
getContents | (data) => string | Promise<string> | false | Функция с объектом options, возвращающая строку или Promise со строкой. Если задан src, не используется. |
write | boolean | false | При true шаблон записывается на диск; иначе доступен только через виртуальную файловую систему. |
name: имя лейаута для definePageMeta и т.п. (default, custom и др.).
Пример
Ниже регистрируется лейаут custom с шапкой и подвалом.
import { addLayout, defineNuxtModule } from '@nuxt/kit'
export default defineNuxtModule({
setup () {
addLayout({
write: true,
filename: 'my-layout.vue',
getContents: () => `<template>
<div>
<header>Мой заголовок</header>
<slot />
<footer>Мой подвал</footer>
</div>
</template>`,
}, 'custom')
},
})
Этот лейаут можно указать на страницах:
pages/about.vue
<script setup lang="ts">
definePageMeta({
layout: 'custom',
})
</script>
<template>
<div>Страница «О нас»</div>
</template>
Так как
@vitejs/plugin-vue не подхватывает виртуальные .vue, для лейаутов на Vue задайте в первом аргументе addLayout опцию write: true.