レイアウト
Nuxt Kitは、レイアウトを扱うためのユーティリティを提供します。
レイアウトは、ページをラップするために使用されます。例えば、ヘッダーやフッターなどの共通コンポーネントでページをラップするために使用できます。レイアウトは addLayout
ユーティリティを使用して登録できます。
addLayout
テンプレートをレイアウトとして登録し、レイアウトに追加します。
Nuxt 2では、このユーティリティを使用して error
レイアウトも登録できます。Nuxt 3+では、error
レイアウトはプロジェクトルートの error.vue
ページに置き換えられました。
使用法
import { addLayout, createResolver, defineNuxtModule } from '@nuxt/kit'
export default defineNuxtModule({
setup () {
const { resolve } = createResolver(import.meta.url)
addLayout({
src: resolve('templates/custom-layout.ts'),
filename: 'custom-layout.ts',
}, 'custom')
},
})
型
function addLayout(layout: NuxtTemplate | string, name: string): void
パラメータ
layout
: テンプレートオブジェクトまたはテンプレートへのパスを持つ文字列。文字列が提供された場合、それは src
が文字列値に設定されたテンプレートオブジェクトに変換されます。テンプレートオブジェクトが提供された場合、以下のプロパティを持っている必要があります:
プロパティ | 型 | 必須 | 説明 |
---|---|---|---|
src | string | false | テンプレートへのパス。src が提供されない場合、代わりに getContents を提供する必要があります。 |
filename | string | false | テンプレートのファイル名。filename が提供されない場合、それは src パスから生成されます。この場合、src オプションが必要です。 |
dst | string | false | 出力先ファイルへのパス。dst が提供されない場合、それは filename パスと nuxt buildDir オプションから生成されます。 |
options | Record<string, any> | false | テンプレートに渡すオプション。 |
getContents | (data) => string | Promise<string> | false | options オブジェクトを引数に取る関数。この関数は文字列または文字列に解決されるプロミスを返す必要があります。src が提供されている場合、この関数は無視されます。 |
write | boolean | false | true に設定すると、テンプレートは出力先ファイルに書き込まれます。それ以外の場合、テンプレートは仮想ファイルシステムでのみ使用されます。 |
name
: レイアウトを登録する名前(例:default
、custom
など)。
例
これは、ヘッダーとフッターでページをラップする custom
という名前のレイアウトを登録します。
import { addLayout, defineNuxtModule } from '@nuxt/kit'
export default defineNuxtModule({
setup () {
addLayout({
write: true,
filename: 'my-layout.vue',
getContents: () => `<template>
<div>
<header>My Header</header>
<slot />
<footer>My Footer</footer>
</div>
</template>`,
}, 'custom')
},
})
このレイアウトをページで使用できます:
pages/about.vue
<script setup lang="ts">
definePageMeta({
layout: 'custom',
})
</script>
<template>
<div>About Page</div>
</template>
@vitejs/plugin-vue
による仮想 .vue
ファイルのサポートがないため、この制限を回避するには、addLayout
の最初の引数に write: true
を渡すことで対処できます。