🍣
【Nuxt3】Layoutを使ってページ共通レイアウトを作成
はじめに
数ページで同じレイアウトを使う場合、各ページで同じコードを書くのがめんどくさかったので、何かいい方法がないか調べていたら、Nuxt3のLayout
という機能が使えそうだったので、試してみました。
Layoutの使い方
-
Layouts/default.vue
を作成 -
app.vue
に<NuxtLayout/>
を追加
Layouts/default.vueを作成
default.vue
は、アプリケーションのデフォルトレイアウトとなり、<slot />
の中に各ページの DOM が挿入されます。
<template>
<header>I'm genius!</header>
<div>
<slot />
</div>
</template>
app.vueに<NuxtLayout/>を追加
<NuxtPage />
にページの DOM が挿入されます。
それを<NuxtLayout />で囲うと、全ページでdefault.vue
のレイアウトが反映されます。
<template>
<NuxtLayout>
<NuxtPage />
</NuxtLayout>
</template>
ページによってレイアウトを変更させたい場合
ページによって以下のようにレイアウトを変更させたい場合、Nuxt ではそれぞれに合わせた機能があります。
Head | Head |
---|---|
特定ページで別のレイアウトを使う | definePageMeta の layout でレイアウトを指定 |
特定ページでレイアウトを無効にする | definePageMeta の layout を false にする |
動的にレイアウトを切り替える | setPageLayout を使う |
特定ページで別のレイアウトを使う
まず、切り替える用のレイアウト(layouts/custom.vue
)を作成します。
<template>
<header>Custom</header>
<div>
<slot />
</div>
</template>
利用するページで、definePageMetaのlayoutを、layoutsディレクトリのファイル名に合わせると、
layouts/custom.vue
のレイアウトが指定したページに反映されます。
<script lang="ts" setup>
definePageMeta({
layout: "custom",
});
</script>
特定ページでレイアウトを無効にする
<script lang="ts" setup>
definePageMeta({
layout: false,
});
</script>
動的にレイアウトを切り替える
動的にレイアウトを切り替える場合、
setPageLayout
の引数にlayoutsディレクトリのファイル名を指定することで実現できます。[1]
<script lang="ts" setup>
definePageMeta({
layout: false,
});
const setLayout = () => {
setPageLayout("custom");
};
</script>
<template>
<div>
<h1>test</h1>
<button @click="setLayout">Enable layout</button>
</div>
</template>
参考文献
Layoutを使ってページ間で共通のUIを利用する【Nuxt3】
Discussion