layouts
Nuxt provides a layouts framework to extract common UI patterns into reusable layouts.
为了获得最佳性能,放置在此目录中的组件在被使用时会通过异步导入自动加载。
启用 布局
通过在你的 app.vue
中添加 <NuxtLayout>
来启用布局:
app/app.vue
<template>
<NuxtLayout>
<NuxtPage />
</NuxtLayout>
</template>
要使用某个布局:
- 在页面中通过 definePageMeta 设置
layout
属性。 - 设置
<NuxtLayout>
的name
属性。
布局名称会被规范化为 kebab-case,因此
someLayout
会变为 some-layout
。如果未指定布局,则会使用
app/layouts/default.vue
。如果你的应用中只有单个布局,建议改为直接使用
app.vue
。与其他组件不同,布局必须只有单个根元素,以便 Nuxt 在布局切换时应用过渡 — 并且该根元素不能是
<slot />
。默认 布局
添加一个 ~/layouts/default.vue
:
app/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/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 |
为清晰起见,我们建议布局的文件名与其名称相匹配:
File | Layout Name |
---|---|
~/layouts/desktop/DesktopDefault.vue | desktop-default |
~/layouts/desktop-base/DesktopBase.vue | desktop-base |
~/layouts/desktop/Desktop.vue | desktop |
Read and edit a live example in Docs > 4 X > Examples > Features > Layouts.
动态更改 布局
你也可以使用 setPageLayout
辅助函数来动态更改布局:
<script setup lang="ts">
function enableCustomLayout () {
setPageLayout('custom')
}
definePageMeta({
layout: false,
})
</script>
<template>
<div>
<button @click="enableCustomLayout">
Update layout
</button>
</div>
</template>
Read and edit a live example in Docs > 4 X > Examples > Features > Layouts.
在单页上覆盖 布局
如果你使用页面(pages),可以通过设置 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>
,请确保它不是根元素(或禁用 布局/页面 过渡)。