基礎入門
UI ArchitectureDRY Principle

佈局系統

Layouts 是 Nuxt 應用程式的骨架。它們允許你定義跨頁面共用的結構(如導覽列、側邊欄、頁尾),避免在每個頁面重複撰寫相同的程式碼。

核心概念

佈局 (Layout) 是一個包覆器 (Wrapper)。它將頁面內容 (Page Content) 包裹在共用的 UI 結構中。 關鍵在於 <slot />,這是頁面內容被注入的地方。

Layout Anatomy
Header
Sidebar
<slot />

Page Content Injected Here

Footer

目錄結構

Nuxt 會自動掃描 layouts/ 目錄。 default.vue 是預設佈局,會自動應用於所有未指定佈局的頁面。

File Structure
  • app/
    • layouts/
      • default.vue預設佈局
      • auth.vue登入/註冊專用
      • docs.vue文件專用

命名規則

佈局檔案名稱即為其 ID。例如 layouts/custom-layout.vue 的 ID 為 'custom-layout'

注意

佈局檔案中必須包含單一根元素 (Single Root Element),且必須包含 <slot />


使用方式

在頁面元件中使用 definePageMeta 來指定該頁面要使用的佈局。

layouts/auth.vue
layouts/auth.vue
<template>
  <div class="h-screen flex items-center justify-center bg-slate-900">
    <div class="w-full max-w-md p-8 bg-slate-800 rounded-xl">
      <!-- 這裡插入登入表單 -->
      <slot />
    </div>
  </div>
</template>
pages/login.vue
pages/login.vue
<script setup>
definePageMeta({
  layout: 'auth'
})
</script>

<template>
  <form>
    <h1>Login</h1>
    <!-- ... -->
  </form>
</template>

動態切換

有時你需要根據使用者狀態(例如是否登入)來動態改變佈局。 可以使用 setPageLayout 函式。 試著點擊下方的按鈕,觀察佈局如何即時切換:

// Usage in Page
definePageMeta({
  layout: 'default'
})
Page Content
<NuxtPage />
<script setup>
const user = useUser()

function toggleLayout() {
  // 動態切換佈局
  setPageLayout(user.value.isLoggedIn ? 'default' : 'auth')
}
</script>

<template>
  <div>
    <button @click="toggleLayout">
      Switch Layout
    </button>
  </div>
</template>

進階技巧:Per-Component Layout

如果你需要完全控制佈局的渲染位置,可以使用 <NuxtLayout> 元件。 這在處理巢狀佈局或複雜的轉場動畫時非常有用。

<template>
  <NuxtLayout name="custom">
    <template #header>...</template>
    <SomeComponent />
  </NuxtLayout>
</template>