简言
Nuxt 提供了一个布局框架,用于将常见的 UI 模式提取为可重用的布局。
为了获得最佳性能,在使用时,放置在此目录中的组件将通过异步导入自动加载。
layouts
layouts文件夹存放的是ui布局文件,就是实现一个页面整体架构规则的vue组件,默认样式布局是在layouts/default.vue组件。
启用布局
通过在 app.vue 中添加 <NuxtLayout>,可以启用布局:
<template>
<NuxtLayout>
<NuxtPage />
</NuxtLayout>
</template>
<NuxtLayout>有一个name属性,可以指定默认布局文件。
若页面要指定特殊的布局组件,则可以在页面中使用 definePageMeta 设置 layout 属性。
definePageMeta({
layout: 'small',
});
默认布局
添加 ~/layouts/default.vue:
<template>
<div>
<p>一些在所有页面之间共享的默认布局内容</p>
<slot />
</div>
</template>
在布局文件中,页面的内容将显示在 组件中。
布局命名
如果你在嵌套目录中有一个布局,则布局的名称将基于其自身的路径目录和文件名,并删除重复的段,为了清晰起见,建议布局的文件名与其名称相匹配:
动态布局
可以使用 setPageLayout 辅助函数动态更改布局:
<script setup lang="ts">
function enableCustomLayout () {
setPageLayout('custom')
}
definePageMeta({
layout: false,
});
</script>
<template>
<div>
<button @click="enableCustomLayout">更新布局</button>
</div>
</template>
页面上覆盖布局
如果你使用页面,可以通过设置 layout: false,然后在页面内部使用 组件来完全控制布局。
如果在页面中使用 ,请确保它不是根元素(或者禁用布局/页面过渡效果)。
<script setup lang="ts">
definePageMeta({
layout: false,
})
</script>
<template>
<div>
<NuxtLayout name="custom">
<template #header> 一些页眉模板内容。 </template>
页面的其余部分
</NuxtLayout>
</div>
</template>
示例
small布局:
<template>
<div class="small">
<p>这是公用的small布局内容 12323</p>
<slot />
</div>
</template>
<script lang="ts" setup>
import { reactive, ref, onMounted } from 'vue';
</script>
<style lang="scss" scoped></style>
big布局:
<template>
<div class="big">
<h1>这是big布局</h1>
<slot />
</div>
</template>
<script lang="ts" setup>
import { reactive, ref, onMounted } from 'vue';
</script>
<style lang="scss" scoped></style>
页面:
<template>
<div class="index">
<NuxtLayout name="small">
页面的其余部分
<button @click="enableCustomLayout">改变布局</button>
</NuxtLayout>
</div>
</template>
<script lang="ts" setup>
definePageMeta({
layout: false,
});
function enableCustomLayout() {
setPageLayout('big');
}
// useSeoMeta({
// title: '我的神奇网站',
// ogTitle: '我的神奇网站',
// description: '这是我的神奇网站,让我来告诉你关于它的一切。',
// ogDescription: '这是我的神奇网站,让我来告诉你关于它的一切。',
// ogImage: 'https://example.com/image.png',
// twitterCard: 'summary_large_image',
// });
</script>
<style lang="scss" scoped></style>
结语
这个layouts文件夹里的布局文件是通过vue组件实现的,所有要注意slot插槽的位置。