layouts
Nuxt 提供了一个布局框架,用于将常见的 UI 模式提取到可重用的布局中。
为了获得最佳性能,放置在此目录中的组件将在使用时通过异步导入自动加载。
启用布局
通过将 <NuxtLayout> 添加到您的 app.vue 文件中来启用布局:
app.vue
<template>
<NuxtLayout>
<NuxtPage />
</NuxtLayout>
</template>
要使用布局:
- 在您的页面中使用 definePageMeta 设置
layout属性。 - 设置
<NuxtLayout>的nameprop。
布局名称会被规范化为 kebab-case 形式,因此
someLayout 会变成 some-layout。如果未指定任何布局,将使用
layouts/default.vue。如果您的应用程序中只有一个布局,我们建议改用 app.vue。
与其他组件不同,您的布局必须具有单个根元素,以便 Nuxt 能够在布局更改之间应用过渡效果 - 并且此根元素不能是 <slot />。
默认布局
添加一个 ~/layouts/default.vue 文件:
layouts/default.vue
<template>
<div>
<p>Some default layout content shared across all pages</p>
<slot />
</div>
</template>
在布局文件中,页面的内容将显示在 <slot /> 组件中。
命名布局
Directory Structure
-| layouts/
---| default.vue
---| custom.vue
然后您可以在您的页面中使用 custom 布局:
pages/about.vue
<script setup lang="ts">
definePageMeta({
layout: 'custom'
})
</script>
您可以使用 <NuxtLayout> 的 name 属性直接覆盖所有页面的默认布局:
app.vue
<script setup lang="ts">
// You might choose this based on an API call or logged-in status
const layout = "custom";
</script>
<template>
<NuxtLayout :name="layout">
<NuxtPage />
</NuxtLayout>
</template>
如果您的布局位于嵌套目录中,布局的名称将基于其自身的路径目录和文件名,重复的段将被删除。
| File | Layout Name |
|---|---|
~/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">
function enableCustomLayout () {
setPageLayout('custom')
}
definePageMeta({
layout: false,
});
</script>
<template>
<div>
<button @click="enableCustomLayout">Update layout</button>
</div>
</template>
基于每个页面覆盖布局
如果您正在使用页面,您可以通过设置 layout: false 然后在页面中使用 <NuxtLayout> 组件来完全控制布局。这种方式适用于需要动态、细粒度控制布局的场景,尤其当页面需定制特殊结构或插槽时。
<script setup lang="ts">
definePageMeta({
layout: false,
})
</script>
<template>
<div> <!-- 新增包裹层 -->
<NuxtLayout name="custom">
<template #header> Some header template content. </template>
The rest of the page
</NuxtLayout>
</div>
</template>
<template>
<div> <!-- 布局文件必须有单根元素 -->
<header>
<slot name="header">
Default header content
</slot>
</header>
<main>
<slot />
</main>
</div>
</template>
如果您在页面中使用 <NuxtLayout>,请确保它不是根元素(或 禁用布局/页面过渡效果)。