【Nuxt3】PageからLayoutを経由してComponentに値を渡す方法
はじめに
今回の記事では、Nuxt3 において、page ファイルで設定した値を layout ファイル内の component に渡す方法について解説したいと思います。
例えば、ページごとに異なるタイトルなどを設定し、それを layout で呼び出しているヘッダーに渡す、といったシチュエーションが考えられますね。
結論
早速ですが結論です。
page ファイルで<NuxtLayout>
コンポーネントを呼び出し、それに Props を渡すことで実現可能です。
サンプルコード
今回の例では、「sample.vue というページファイルで設定した値を、custom.vue というレイアウトファイルを経由して、commmonPageTitle というコンポーネントファイルに渡す」と想定します。
page
<script lang="ts" setup>
// NuxtLayoutとの競合を避けるためにfalseにする
definePageMeta({
layout: false,
});
// layout/componentに渡すために定義
const props = defineProps<{
pageTitle?: string;
}>();
const title: string = "ページのタイトル";
</script>
<template>
<div>
<NuxtLayout name="custom" :pageTitle="title">
<!-- pageコンテンツ -->
</NuxtLayout>
</div>
</template>
まずは script 内で ページタイトルを設定します。また、この値をコンポーネントに渡すため props も宣言しておきましょう。
次に、template 内で<NuxtLayout>
を呼び出します。この<NuxtLayout>
に、先ほどの props を渡してあげることで、layout ファイルに定数 title の値が pageTitle として受け渡されることになります。
<NuxtLayout>
を呼び出す際の注意点として、デフォルトレイアウトとの競合を防ぐために、definePageMeta でlayout: false
を設定してあげる必要があります。
layout
<script setup lang="ts">
// Componentに渡すために定義
const props = defineProps<{
pageTitle: string;
}>()
</script>
<template>
<div>
<header>
<CommonPageTitle :pageTitle="pageTitle" />
</header>
<main>
<slot />
</main>
</div>
</template>
page と同じ要領で、props を宣言して component(CommonPageTitle)に渡しましょう。
component
<script setup lang="ts">
// Layoutから渡されるものを定義
const props = defineProps<{
pageTitle: string;
}>();
</script>
<template>
<div>
<h1>
{{ props.pageTitle }}
</h1>
</div>
</template>
script 内で props を宣言するのは他のファイルと同様です。
template 内ではマスタッシュ構文で props の pageTitle を展開しましょう。
これで page から来た値を受け取ることができました!
まとめ
今回は、Page から Layout を経由して Component に値を渡す方法を解説しました。
<NuxtLayout>
コンポーネントを呼び出して、そこに Props を渡すことで実装できます。
Discussion
当局は現在 nuxt4 を準備中です