布局(Layouts)用于作为页面的包装器。它可以用来将页面包裹在一些通用组件中,例如页头和页脚。布局可以通过 addLayout 工具进行注册。
addLayout注册模板为布局并添加到布局列表中。
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 | 模板的文件名。如果未提供 filename,则会从 src 路径生成。在这种情况下,必须提供 src 选项。 |
dst | string | false | 目标文件的路径。如果未提供 dst,则会根据 filename 路径和 nuxt 的 buildDir 选项生成。 |
options | Record<string, any> | false | 传递给模板的选项。 |
getContents | (data) => string | Promise<string> | false | 一个会使用 options 对象调用的函数。它应返回字符串或解析为字符串的 Promise。如果提供了 src,则会忽略此函数。 |
write | boolean | false | 如果设置为 true,模板将被写入目标文件。否则,模板仅在虚拟文件系统中使用。 |
name:布局注册时使用的名称(例如 default、custom 等)。
以下示例注册了一个名为 custom 的布局,用以在页面中包裹页头和页脚。
import { addLayout, defineNuxtModule } from '@nuxt/kit'
export default defineNuxtModule({
setup () {
addLayout({
write: true,
filename: 'my-layout.vue',
getContents: () => `<template>
<div>
<header>My Header</header>
<slot />
<footer>My Footer</footer>
</div>
</template>`,
}, 'custom')
},
})
然后你可以在页面中使用该布局:
<script setup lang="ts">
definePageMeta({
layout: 'custom',
})
</script>
<template>
<div>关于页面</div>
</template>
@vitejs/plugin-vue 不支持虚拟的 .vue 文件,你可以通过在 addLayout 的第一个参数中设置 write: true 来规避该限制。