最終更新日: 2023年08月15日
レイアウト ディレクトリ
Nuxtはカスタマイズ可能なレイアウトフレームワークを提供しており、アプリケーション全体で使用できます。共通のUIやコードパターンを再利用可能なレイアウトコンポーネントに抽出するのに最適です。
レイアウトはlayouts/
ディレクトリに配置され、使用時に非同期インポートを介して自動的にロードされます。レイアウトは、app.vueに <NuxtLayout>
を追加することで使用されます。~/pages
の統合を使用している場合は、ページのメタデータの一部として layout プロパティを設定するか、<NuxtLayout>
のプロップスとして手動で指定します。(注:レイアウト名はケバブケースに正規化されるため、someLayout
は some-layout
になります。)
もしアプリケーションに1つのレイアウトしかない場合は、app.vue を使用することをおすすめします。
Info 他のコンポーネントとは異なり、レイアウトはレイアウトの変更間でトランジションを適用するために、1つのルート要素を持つ必要があります。そして、このルート要素は
<slot />
であってはなりません。 デフォルトのレイアウトを有効にする
~/layouts/default.vue
を追加:
- layouts/default.vue
- vue
<template>
<div>
// すべてのページで共有されるデフォルトのレイアウト
<slot />
</div>
</template>
レイアウトファイルでは、レイアウトのコンテンツは<slot /> にロードされます。特別なコンポーネントを使用する必要はありません。
もしapp.vue
を使用する場合、<NuxtLayout>
も追加する必要があります。
- app.vue
- vue
<template>
<NuxtLayout>
// ページのコンテンツ
</NuxtLayout>
</template>
別のレイアウトを設定する
- ts
-| layouts/
---| default.vue
---| custom.vue
次のようにして、デフォルトのレイアウトを直接上書きできます:
- app.vue
- ts
<script setup lang="ts">
// API呼び出しやログイン状態に基づいて選択することがあります
const layout = "custom";
</script>
<template>
<NuxtLayout :name="layout">
<NuxtPage />
</NuxtLayout>
</template>
また、次のようにしてページごとにデフォルトのレイアウトを上書きすることもできます:
- pages/index.vue
- ts
<script>
// これは <script setup> と <script> の両方で動作します
definePageMeta({
layout: "custom",
});
</script>
- app.vue
- vue
<template>
<NuxtLayout>
<NuxtPage />
</NuxtLayout>
</template>
- layouts/custom.vue
- vue
<template>
<div>
カスタムレイアウト
<slot />
</div>
</template>
- layouts/default.vue
- vue
<template>
<div>
デフォルトレイアウト
<slot />
</div>
</template>
Info
ページメタデータの定義について詳しく学ぶ。
動的にレイアウトを変更する
レイアウトにはref
やcomputed
プロパティを使用することもできます。
- ts
<script setup lang="ts">
function enableCustomLayout () {
setPageLayout('custom')
}
definePageMeta({
layout: false,
});
</script>
<template>
<div>
<button @click="enableCustomLayout">Update layout</button>
</div>
</template>
Info
ドキュメント > 例 > 機能 > レイアウト にあるライブの例を読み込んで編集してください。
ページごとにレイアウトを上書きする。
~/pages
の統合を使用している場合、layout: false
を設定して、ページ内で<NuxtLayout>
コンポーネントを使用することで、完全な制御を取ることができます。
- pages/index.vue
- vue
<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>
- layouts/custom.vue
- vue
<template>
<div>
<header>
<slot name="header">
Default header content
</slot>
</header>
<main>
<slot />
</main>
</div>
</template>
Info ページ内で
<NuxtLayout>
を使用する場合は、ルート要素にならないようにしてください(またはレイアウト/ページのトランジションを無効にしてください)。