透過 100+ 個技巧的集合來學習 Nuxt!

layouts

Nuxt 提供 layouts 框架,將常見的 UI 模式提取到可重複使用的 layouts 中。
為了獲得最佳效能,放置在此目錄中的元件將在使用時透過非同步匯入自動載入。

啟用 Layouts

透過將 <NuxtLayout> 新增至您的 app.vue 來啟用 Layouts

app.vue
<template>
  <NuxtLayout>
    <NuxtPage />
  </NuxtLayout>
</template>

若要使用 layout

  • 使用 definePageMeta 在您的頁面中設定 layout 屬性。
  • 設定 <NuxtLayout>name 屬性。
layout 名稱會標準化為 kebab-case,因此 someLayout 會變成 some-layout
如果未指定 layout,則會使用 layouts/default.vue
如果您的應用程式中只有單一 layout,我們建議改用 app.vue
與其他元件不同,您的 layouts 必須具有單一根元素,以便 Nuxt 能夠在 layout 變更之間套用轉場效果 - 而且此根元素不能是 <slot />

預設 Layout

新增 ~/layouts/default.vue

layouts/default.vue
<template>
  <div>
    <p>Some default layout content shared across all pages</p>
    <slot />
  </div>
</template>

在 layout 檔案中,頁面的內容將會顯示在 <slot /> 元件中。

具名 Layout

目錄結構
-| layouts/
---| default.vue
---| custom.vue

然後您可以在您的頁面中使用 custom layout

pages/about.vue
<script setup lang="ts">
definePageMeta
({
layout
: 'custom'
}) </script>
了解更多關於 definePageMeta 的資訊。

您可以使用 <NuxtLayout>name 屬性,直接覆寫所有頁面的預設 layout

app.vue
<script setup lang="ts">
// You might choose this based on an API call or logged-in status
const layout = "custom";
</script>

<template>
  <NuxtLayout :name="layout">
    <NuxtPage />
  </NuxtLayout>
</template>

如果您在巢狀目錄中有 layout,則 layout 的名稱將根據其自身的路徑目錄和檔案名稱,並移除重複的區段。

檔案Layout 名稱
~/layouts/desktop/default.vuedesktop-default
~/layouts/desktop-base/base.vuedesktop-base
~/layouts/desktop/index.vuedesktop

為了清楚起見,我們建議 layout 的檔案名稱應與其名稱相符

檔案Layout 名稱
~/layouts/desktop/DesktopDefault.vuedesktop-default
~/layouts/desktop-base/DesktopBase.vuedesktop-base
~/layouts/desktop/Desktop.vuedesktop
文件 > 範例 > 功能 > Layouts 中閱讀和編輯即時範例。

動態變更 Layout

您也可以使用 setPageLayout 輔助程式來動態變更 layout

<script setup lang="ts">
function 
enableCustomLayout
() {
setPageLayout
('custom')
}
definePageMeta
({
layout
: false,
}); </script> <template> <
div
>
<
button
@
click
="
enableCustomLayout
">Update layout</
button
>
</
div
>
</template>
文件 > 範例 > 功能 > Layouts 中閱讀和編輯即時範例。

在每個頁面基礎上覆寫 Layout

如果您正在使用 pages,您可以透過設定 layout: false,然後在頁面中使用 <NuxtLayout> 元件來取得完全控制權。

<script setup lang="ts">
definePageMeta({
  layout: false,
})
</script>

<template>
  <div>
    <NuxtLayout name="custom">
      <template #header> Some header template content. </template>

      The rest of the page
    </NuxtLayout>
  </div>
</template>
如果您在頁面中使用 <NuxtLayout>,請確保它不是根元素(或停用 layout/頁面轉場效果)。