布局目录 layouts 用于组织应用的布局组件。像一般通用的模板,例如 头部 header 与 底部 footer 之类的,也有一些较为通用的通用模板;

布局的使用方法是将 添加到 app.vue 中,或者通过手动给具体某个页面指定为布局。(注意:布局名称被规范化为kebab-case,所以someLayout会变成some-layout)

:::info 与其他组件不同,layout 必须有一个单一的根元素,以允许 Nuxt 在布局变化之间应用过渡,这个根元素不能是一个。 :::

设置默认布局

可以通过添加 layouts/default.vue 文件来扩展应用的默认布局

新建 src/layouts 目录,新建 src/layouts/default.vue 默认布局文件;

  1. <template>
  2. <div>
  3. <h1>系统标题</h1>
  4. <slot />
  5. </div>
  6. </template>

如果应用程序中只有一个布局,建议在全局页面src/app.vue中配置,这样每个页面中都会有该模板;使用<NuxtLayout>组件应用布局模板 , 下面例子中使用 将页面添加到模板中的默认 位置 :::warning 如果在页面中使用,请确保不是根元素(或禁用布局/页面过渡)。 :::

  1. <template>
  2. <div>
  3. <NuxtLayout>
  4. <NuxtPage></NuxtPage>
  5. </NuxtLayout>
  6. </div>
  7. </template>

这样所有页面都应用了该布局模板

image.pngimage.png

设置指定页面的块布局

可以为指定页面单独设置布局模板,新建 src/layouts/custom.vue

  1. <template>
  2. <header class="header">
  3. <h1>
  4. <slot name="header"> Default header content </slot>
  5. </h1>
  6. </header>
  7. </template>

在 about 页面中使用自定义模板

  1. <template>
  2. <div>
  3. <h1>nuxt3 about page</h1>
  4. <NuxtLayout name="custom">
  5. <template #header> Some header template content. </template>
  6. </NuxtLayout>
  7. </div>
  8. </template>

相当于当做一个布局组件来使用
image.png

覆盖默认布局

如果某个页面不想应用默认布局,可以像这样覆盖默认布局:通过 definePageMeta 中的 layout 字段来给页面取消默认布局,然后在页面中使用<NuxtLayout>组件控制布局

  1. <template>
  2. <div> <!-- 这里必须有一个根元素 -->
  3. <NuxtLayout name="custom">
  4. <template #header> nuxt3 about page </template>
  5. 其他页面内容
  6. </NuxtLayout>
  7. </div>
  8. </template>
  9. <script setup>
  10. definePageMeta({
  11. layout: false,
  12. });
  13. const layout = "custom";
  14. </script>


动态更改布局

nuxt 提供 setPageLayout 方法允许您动态更改页面的布局。

  1. <template>
  2. <div>
  3. <button @click="enableCustomLayout">Update layout</button>
  4. </div>
  5. </template>
  6. <script setup>
  7. function enableCustomLayout () {
  8. setPageLayout('custom')
  9. }
  10. definePageMeta({
  11. layout: false,
  12. });
  13. </script>

或者

  1. <template>
  2. <div>
  3. <button @click="enableCustomLayout">Update layout</button>
  4. </div>
  5. </template>
  6. <script setup>
  7. const route = useRoute()
  8. function enableCustomLayout () {
  9. route.meta.layout = "custom"
  10. }
  11. definePageMeta({
  12. layout: false,
  13. });
  14. </script>