nuxt logo

ドキュメント翻訳(非公式)

<NuxtPage>

<NuxtPage> コンポーネントは、pages/ ディレクトリにあるページを表示するために必要です。

<NuxtPage> は Nuxt に組み込まれているコンポーネントで、app/pages/ ディレクトリにあるトップレベルまたはネストされたページを表示することができます。

<NuxtPage> は Vue Router の <RouterView> のラッパーです。内部状態を追加で管理するため、<RouterView> の代わりに使用する必要があります。そうしないと、useRoute() が不正なパスを返す可能性があります。

<NuxtPage> には以下のコンポーネントが含まれています:

<template>
  <RouterView #default="{ Component }">
    <!-- トランジションを使用する場合はオプション -->
    <Transition>
      <!-- keep-alive を使用する場合はオプション -->
      <KeepAlive>
        <Suspense>
          <component :is="Component" />
        </Suspense>
      </KeepAlive>
    </Transition>
  </RouterView>
</template>

デフォルトでは、Nuxt は <Transition><KeepAlive> を有効にしていません。これらを有効にするには、nuxt.config ファイルで設定するか、<NuxtPage>transitionkeepalive プロパティを設定してください。特定のページを定義したい場合は、ページコンポーネントの definePageMeta で設定できます。

ページコンポーネントで <Transition> を有効にする場合、ページに単一のルート要素があることを確認してください。

<NuxtPage> は内部で <Suspense> を使用しているため、ページ変更時のコンポーネントライフサイクルの挙動が通常の Vue アプリケーションとは異なります。

通常の Vue アプリケーションでは、新しいページコンポーネントは前のコンポーネントが完全にアンマウントされた 後にのみ マウントされます。しかし、Nuxt では、Vue の <Suspense> の実装方法により、新しいページコンポーネントは前のコンポーネントがアンマウントされる 前に マウントされます。

Props

  • name: <RouterView> に一致するルートレコードのコンポーネントオプションで対応する名前のコンポーネントをレンダリングさせます。
    • type: string
  • route: すべてのコンポーネントが解決されたルートの場所。
    • type: RouteLocationNormalized
  • pageKey: NuxtPage コンポーネントが再レンダリングされるタイミングを制御します。
    • type: string または function
  • transition: NuxtPage コンポーネントでレンダリングされるすべてのページに対するグローバルトランジションを定義します。
  • keepalive: NuxtPage コンポーネントでレンダリングされるページの状態保持を制御します。

Nuxt は /pages ディレクトリ内のすべての Vue コンポーネントファイルをスキャンしてレンダリングすることで、nameroute を自動的に解決します。

Example

例えば、変更されないキーを渡すと、<NuxtPage> コンポーネントは最初にマウントされたときにのみレンダリングされます。

app/app.vue
<template>
  <NuxtPage page-key="static" />
</template>

現在のルートに基づいた動的なキーを使用することもできます:

<NuxtPage :page-key="route => route.fullPath" />

ここで $route オブジェクトを使用しないでください。<NuxtPage><Suspense> を使用してページをレンダリングする方法に問題を引き起こす可能性があります。

また、pageKey/pages ディレクトリ内の Vue コンポーネントの <script> セクションから definePageMeta を介して key 値として渡すこともできます。

app/pages/my-page.vue
definePageMeta({
  key: route => route.fullPath
})
サンプルコードの編集とプレビューexamples > routing > pages

Page's Ref

ページコンポーネントの ref を取得するには、ref.value.pageRef を通じてアクセスします。

app/app.vue
<script setup lang="ts">
const page = ref()

function logFoo () {
  page.value.pageRef.foo()
}
</script>

<template>
  <NuxtPage ref="page" />
</template>
my-page.vue
const foo = () => {
  console.log('foo method called')
}

defineExpose({
  foo,
})

Custom Props

<NuxtPage> は、階層をさらに下に渡す必要があるカスタムプロップも受け取ります。

例えば、以下の例では、foobar の値が NuxtPage コンポーネントに渡され、その後ページコンポーネントに渡されます。

app/app.vue
<template>
  <NuxtPage :foobar="123" />
</template>

ページコンポーネントで foobar プロップにアクセスできます:

app/pages/page.vue
<script setup lang="ts">
const props = defineProps<{ foobar: number }>()

console.log(props.foobar) // 出力: 123

defineProps でプロップを定義していない場合でも、NuxtPage に渡されたプロップはページの attrs から直接アクセスできます:

app/pages/page.vue
const attrs = useAttrs()
console.log(attrs.foobar) // 出力: 123
こちらも参照 guide > directory-structure > app > pages