layouts
Nuxtは共通のUIパターンを再利用可能なレイアウトに抽出するためのレイアウトフレームワークを提供します。
最高のパフォーマンスを得るために、このディレクトリに配置されたコンポーネントは使用時に非同期インポートを通じて自動的にロードされます。
レイアウトを有効にする
レイアウトは、app.vue
に <NuxtLayout>
を追加することで有効になります:
<template>
<NuxtLayout>
<NuxtPage />
</NuxtLayout>
</template>
レイアウトを使用するには:
- definePageMeta を使用してページに
layout
プロパティを設定します。 <NuxtLayout>
のname
プロパティを設定します。
レイアウト名はケバブケースに正規化されるため、someLayout
は some-layout
になります。
レイアウトが指定されていない場合、layouts/default.vue
が使用されます。
アプリケーションにレイアウトが1つしかない場合は、app.vue
を使用することをお勧めします。
他のコンポーネントとは異なり、レイアウトには単一のルート要素が必要であり、Nuxtがレイアウト変更間のトランジションを適用できるようにする必要があります。このルート要素は <slot />
ではありません。
デフォルトレイアウト
~/layouts/default.vue
を追加します:
<template>
<div>
<p>すべてのページで共有されるデフォルトのレイアウトコンテンツ</p>
<slot />
</div>
</template>
レイアウトファイル内では、ページのコンテンツは <slot />
コンポーネントに表示されます。
名前付きレイアウト
-| layouts/
---| default.vue
---| custom.vue
その後、ページで custom
レイアウトを使用できます:
definePageMeta({
layout: 'custom'
})
すべてのページのデフォルトレイアウトを直接上書きするには、<NuxtLayout>
の name
プロパティを使用します:
<script setup lang="ts">
// APIコールやログイン状態に基づいて選択することができます
const layout = "custom";
</script>
<template>
<NuxtLayout :name="layout">
<NuxtPage />
</NuxtLayout>
</template>
ネストされたディレクトリにレイアウトがある場合、レイアウトの名前はそのパスディレクトリとファイル名に基づき、重複するセグメントが削除されます。
ファイル | レイアウト名 |
---|---|
~/layouts/desktop/default.vue | desktop-default |
~/layouts/desktop-base/base.vue | desktop-base |
~/layouts/desktop/index.vue | desktop |
明確にするために、レイアウトのファイル名がその名前と一致することをお勧めします:
ファイル | レイアウト名 |
---|---|
~/layouts/desktop/DesktopDefault.vue | desktop-default |
~/layouts/desktop-base/DesktopBase.vue | desktop-base |
~/layouts/desktop/Desktop.vue | desktop |
レイアウトを動的に変更する
setPageLayout
ヘルパーを使用して、レイアウトを動的に変更することもできます:
<script setup lang="ts">
function enableCustomLayout () {
setPageLayout('custom')
}
definePageMeta({
layout: false,
});
</script>
<template>
<div>
<button @click="enableCustomLayout">レイアウトを更新</button>
</div>
</template>
ページごとにレイアウトを上書きする
ページを使用している場合、layout: false
を設定し、ページ内で <NuxtLayout>
コンポーネントを使用することで完全に制御できます。
<script setup lang="ts">
definePageMeta({
layout: false,
})
</script>
<template>
<div>
<NuxtLayout name="custom">
<template #header> ヘッダーのテンプレートコンテンツ。 </template>
ページの残りの部分
</NuxtLayout>
</div>
</template>
ページ内で <NuxtLayout>
を使用する場合、それがルート要素でないことを確認してください(またはレイアウト/ページトランジションを無効にする)。
※このページは Nuxt.js 公式ドキュメントの翻訳ページ(非公式)です。
公式ドキュメントの該当ページはこちら:
https://nuxt.com/docs/3.x/guide/directory-structure/layouts