layouts
布局模板通常放置在
./layouts目錄之下,也具有異步自動導入的效果,當新增好布局檔案後,我們就可以在app.vue中,添加<NuxtLayout />元件來表示使用布局模板,也可以通過name設定不同的模板名稱。
建立一個預設的布局模板
布局模板在 Nuxt 3 中有約定一個名稱為 default.vue 作為預設的模板,如果在頁面元件中未特別指定要使用哪個模板或 <NuxtLayout /> 沒有設定 name 屬性,那麼都將會使用 default 作為預設的布局。
Step 1. 建立預設布局模板
新增 ./layouts/default.vue 檔案內容如下:
<template>
<div class="bg-sky-100 py-2">
<p class="px-6 py-4 text-2xl text-gray-700">這是預設的布局,全部頁面都會使用到</p>
<slot />
</div>
</template>
在布局模板中,通常會包含一個 <slot /> 插槽,這個未命名的插槽 (slot) 即為預設插槽,這將會是採用這個布局模板的頁面元件,顯示的內容容器位置。
Step 2. 添加 元件
調整 app.vue 檔案,內容如下,我們添加 <NuxtLayout> 作為布局模板顯示的位置,name 屬性預設是 default,不過我們還是寫上 name="default" 避免誤會,這個 name 屬性值對應的即是布局模板的名稱。
布局模板呈現
下圖可以看見,我們在 app.vue 所寫的文字「這裡是最外層 app.vue」,會是在最外層,而緊接著的 <NuxtLayout name="default"></NuxtLayout>,就是布局頁面 default.vue。

布局模板中的插槽
如果你有注意到,default.vue 檔案內程式碼內,有一個插槽 <slot />,這裡就會是 <NuxtLayout> 內的元素所顯示的位置。
例如,我們在 app.vue 稍作調整:
<template>
<div class="m-4 bg-white">
<p class="pb-4 text-2xl text-slate-600">這裡是最外層 app.vue</p>
<NuxtLayout name="default">
<p class="px-6 pt-4 text-xl text-slate-800">被 NuxtLayout 包裹的元件將會放置到 Layout 的 slot 中</p>
</NuxtLayout>
</div>
</template>
被 <NuxtLayout name="default"> 包裹的元素,就會在布局模板中的插槽 <slot /> 顯示。

在布局模板中建立多個插槽
當然,你也可以在布局模板中添加多個插槽,並給予名稱,這樣就可以將內容安排到特定的位置。
Step 1. 建立兩個具名的插槽 (Slot),分別為 header 與 footer
如果插槽沒有給予
name屬性,預設為default。./layouts/default.vue檔案內容如下:
<template>
<div class="bg-sky-100 py-2">
<p class="px-6 py-4 text-2xl text-gray-700">這是預設的布局,全部頁面都會使用到</p>
<slot name="header" />
<slot />
<slot name="footer" />
</div>
</template>
Step 2. 將不同內容,顯示於指定的插槽位置。
app.vue,內容如下:
<template>
<div class="m-4 bg-white">
<p class="pb-4 text-2xl text-slate-600">這裡是最外層 app.vue</p>
<NuxtLayout name="default">
<template #header>
<p class="px-6 pt-4 text-xl text-green-500">這段會放置在 header 插槽</p>
</template>
<template #default>
<p class="px-6 pt-4 text-xl text-cyan-500">被 NuxtLayout 包裹的元件將會放置到 Layout 的預設 slot 中</p>
</template>
<template #footer>
<p class="px-6 pt-4 text-xl text-blue-500">這段會放置在 footer 插槽</p>
</template>
</NuxtLayout>
</div>
</template>
布局模板呈現
下圖可以看見,我們就可以依此來安排各個元件,於布局模板插槽的所在位置。

布局模板與路由頁面
當你熟悉了插槽配置,你也可以在其中添加 <NuxtPage /> 與建立 pages 下的頁面元件,以達到不同的路由頁面,使用相同的布局方式。
如果布局模板結合了路由頁面,整體網站就會如下的巢狀顯示方式,網站的入口點 app.vue 放置布局模板,模板內的內容則使用路由的 <NuxtPage />,最後各個路由的頁面就會在 <NuxtPage /> 容器中顯示。
+---------------------------+
| app.vue |
| +-----------------------+ |
| | layout | |
| | +-------------------+ | |
| | | page | | |
| | | | | |
| | | | | |
| | +-------------------+ | |
| +-----------------------+ |
+---------------------------+