nuxt logo

ドキュメント翻訳(非公式)

layouts

Nuxtは共通のUIパターンを再利用可能なレイアウトに抽出するためのレイアウトフレームワークを提供します。

最高のパフォーマンスを得るために、このディレクトリに配置されたコンポーネントは使用時に非同期インポートを通じて自動的にロードされます。

レイアウトを有効にする

レイアウトは、app.vue<NuxtLayout> を追加することで有効になります:

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

レイアウトを使用するには:

  • definePageMeta を使用してページに layout プロパティを設定します。
  • <NuxtLayout>name プロパティを設定します。

レイアウト名はケバブケースに正規化されるため、someLayoutsome-layout になります。

レイアウトが指定されていない場合、layouts/default.vue が使用されます。

アプリケーションにレイアウトが1つしかない場合は、app.vue を使用することをお勧めします。

他のコンポーネントとは異なり、レイアウトには単一のルート要素が必要であり、Nuxtがレイアウト変更間のトランジションを適用できるようにする必要があります。このルート要素は <slot /> ではありません。

デフォルトレイアウト

~/layouts/default.vue を追加します:

layouts/default.vue
<template>
  <div>
    <p>すべてのページで共有されるデフォルトのレイアウトコンテンツ</p>
    <slot />
  </div>
</template>

レイアウトファイル内では、ページのコンテンツは <slot /> コンポーネントに表示されます。

名前付きレイアウト

Directory Structure
-| layouts/
---| default.vue
---| custom.vue

その後、ページで custom レイアウトを使用できます:

pages/about.vue
definePageMeta({
  layout: 'custom'
})
こちらも参照 guide > directory-structure > pages#page-metadata

すべてのページのデフォルトレイアウトを直接上書きするには、<NuxtLayout>name プロパティを使用します:

app.vue
<script setup lang="ts">
// APIコールやログイン状態に基づいて選択することができます
const layout = "custom";
</script>

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

ネストされたディレクトリにレイアウトがある場合、レイアウトの名前はそのパスディレクトリとファイル名に基づき、重複するセグメントが削除されます。

ファイルレイアウト名
~/layouts/desktop/default.vuedesktop-default
~/layouts/desktop-base/base.vuedesktop-base
~/layouts/desktop/index.vuedesktop

明確にするために、レイアウトのファイル名がその名前と一致することをお勧めします:

ファイルレイアウト名
~/layouts/desktop/DesktopDefault.vuedesktop-default
~/layouts/desktop-base/DesktopBase.vuedesktop-base
~/layouts/desktop/Desktop.vuedesktop
サンプルコードの編集とプレビューexamples > features > layouts

レイアウトを動的に変更する

setPageLayout ヘルパーを使用して、レイアウトを動的に変更することもできます:

<script setup lang="ts">
function enableCustomLayout () {
  setPageLayout('custom')
}
definePageMeta({
  layout: false,
});
</script>

<template>
  <div>
    <button @click="enableCustomLayout">レイアウトを更新</button>
  </div>
</template>
サンプルコードの編集とプレビューexamples > features > layouts

ページごとにレイアウトを上書きする

ページを使用している場合、layout: false を設定し、ページ内で <NuxtLayout> コンポーネントを使用することで完全に制御できます。

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

<template>
  <div>
    <NuxtLayout name="custom">
      <template #header> ヘッダーのテンプレートコンテンツ。 </template>

      ページの残りの部分
    </NuxtLayout>
  </div>
</template>

ページ内で <NuxtLayout> を使用する場合、それがルート要素でないことを確認してください(またはレイアウト/ページトランジションを無効にする)。