布局目录 layouts 用于组织应用的布局组件。像一般通用的模板,例如 头部 header 与 底部 footer 之类的,也有一些较为通用的通用模板;
布局的使用方法是将
:::info
与其他组件不同,layout 必须有一个单一的根元素,以允许 Nuxt 在布局变化之间应用过渡,这个根元素不能是一个
设置默认布局
可以通过添加 layouts/default.vue
文件来扩展应用的默认布局
新建 src/layouts
目录,新建 src/layouts/default.vue
默认布局文件;
<template>
<div>
<h1>系统标题</h1>
<slot />
</div>
</template>
如果应用程序中只有一个布局,建议在全局页面src/app.vue
中配置,这样每个页面中都会有该模板;使用<NuxtLayout>
组件应用布局模板 , 下面例子中使用
<template>
<div>
<NuxtLayout>
<NuxtPage></NuxtPage>
</NuxtLayout>
</div>
</template>
这样所有页面都应用了该布局模板
设置指定页面的块布局
可以为指定页面单独设置布局模板,新建 src/layouts/custom.vue
<template>
<header class="header">
<h1>
<slot name="header"> Default header content </slot>
</h1>
</header>
</template>
在 about 页面中使用自定义模板
<template>
<div>
<h1>nuxt3 about page</h1>
<NuxtLayout name="custom">
<template #header> Some header template content. </template>
</NuxtLayout>
</div>
</template>
相当于当做一个布局组件来使用
覆盖默认布局
如果某个页面不想应用默认布局,可以像这样覆盖默认布局:通过 definePageMeta 中的 layout 字段来给页面取消默认布局,然后在页面中使用<NuxtLayout>
组件控制布局
<template>
<div> <!-- 这里必须有一个根元素 -->
<NuxtLayout name="custom">
<template #header> nuxt3 about page </template>
其他页面内容
</NuxtLayout>
</div>
</template>
<script setup>
definePageMeta({
layout: false,
});
const layout = "custom";
</script>
动态更改布局
nuxt 提供 setPageLayout 方法允许您动态更改页面的布局。
<template>
<div>
<button @click="enableCustomLayout">Update layout</button>
</div>
</template>
<script setup>
function enableCustomLayout () {
setPageLayout('custom')
}
definePageMeta({
layout: false,
});
</script>
或者
<template>
<div>
<button @click="enableCustomLayout">Update layout</button>
</div>
</template>
<script setup>
const route = useRoute()
function enableCustomLayout () {
route.meta.layout = "custom"
}
definePageMeta({
layout: false,
});
</script>