ページとレイアウト
app.vue
Nuxt 3では、~/app.vue
を通じてアプリへの中心的なエントリーポイントが提供されます。
app.vue
ファイルがない場合、Nuxtは独自のデフォルトバージョンを使用します。このファイルは、アプリの起動時に一度だけ実行する必要があるカスタムコードや、アプリのすべてのページに存在するコンポーネントを配置するのに最適な場所です。たとえば、レイアウトが1つしかない場合は、これをapp.vue
に移動できます。
移行
app.vue
ファイルを作成し、アプリのトップレベルで一度だけ実行する必要があるロジックを含めることを検討してください。こちらの例をご覧ください。
レイアウト
複数のページでアプリ内でレイアウトを使用している場合は、わずかな変更のみが必要です。
Nuxt 2では、<Nuxt>
コンポーネントがレイアウト内で使用され、現在のページをレンダリングしていました。Nuxt 3では、レイアウトの代わりにスロットを使用するため、そのコンポーネントを<slot />
に置き換える必要があります。これにより、名前付きスロットやスコープ付きスロットを使用した高度なユースケースも可能になります。レイアウトの詳細はこちらをご覧ください。
また、definePageMeta
コンパイラマクロを使用して、ページで使用されるレイアウトを定義する方法を変更する必要があります。レイアウトはケバブケースになります。したがって、layouts/customLayout.vue
は、ページで参照されるとcustom-layout
になります。
移行
<Nuxt />
を<slot />
に置き換えます。layouts/custom.vue<template> <div id="app-layout"> <main> - <Nuxt /> + <slot /> </main> </div> </template>
- ページで使用されるレイアウトを選択するには、
definePageMeta
を使用します。pages/index.vue<script> + definePageMeta({ + layout: 'custom' + }) - export default { - layout: 'custom' - } </script>
~/layouts/_error.vue
を~/error.vue
に移動します。エラー処理ドキュメントを参照してください。このページがレイアウトを使用するようにする場合は、error.vue
内で直接<NuxtLayout>
を使用できます。error.vue<template> <div> <NuxtLayout name="default"> <!-- --> </NuxtLayout> </div> </template>
ページ
Nuxt 3には、ソースディレクトリにpages/
ディレクトリが存在することによってトリガーされる、オプションのvue-router
統合が付属しています。ページが1つしかない場合は、代わりにapp.vue
に移動して軽量なビルドを検討してください。
動的ルート
Nuxt 3で動的ルートを定義するための形式はNuxt 2とはわずかに異なるため、pages/
内のファイルの名前を変更する必要がある場合があります。
- 以前は
_id
を使用して動的ルートパラメーターを定義していましたが、現在は[id]
を使用します。 - 以前は
_.vue
を使用してキャッチオールルートを定義していましたが、現在は[...slug].vue
を使用します。
ネストされたルート
Nuxt 2では、<Nuxt>
と<NuxtChild>
を使用して、ネストされたルート(親コンポーネントと子コンポーネントを含む)を定義していたでしょう。Nuxt 3では、これらは単一の<NuxtPage>
コンポーネントに置き換えられました。
ページキーとキープアライブプロパティ
カスタムページキーまたはキープアライブプロパティを<Nuxt>
に渡していた場合は、definePageMeta
を使用してこれらのオプションを設定するようになりました。
ページとレイアウトのトランジション
コンポーネントオプションでページまたはレイアウトのトランジションを直接定義していた場合は、definePageMeta
を使用してトランジションを設定する必要があります。Vue 3以降、-enterと-leave CSSクラスの名前が変更されました。<Nuxt>
のstyle
プロパティは、<slot>
で使用するとトランジションに適用されなくなったため、スタイルを-active
クラスに移動します。
移行
- 動的パラメーターを持つページの名前を新しい形式に一致するように変更します。
<Nuxt>
と<NuxtChild>
を<NuxtPage>
に更新します。- Composition APIを使用している場合は、
this.$route
とthis.$router
をuseRoute
とuseRouter
コンポーザブルを使用するように移行することもできます。
例:動的ルート
- URL: /users
- Page: /pages/users/index.vue
- URL: /users/some-user-name
- Page: /pages/users/_user.vue
- Usage: params.user
- URL: /users/some-user-name/edit
- Page: /pages/users/_user/edit.vue
- Usage: params.user
- URL: /users/anything-else
- Page: /pages/users/_.vue
- Usage: params.pathMatch
例:ネストされたルートとdefinePageMeta
<template>
<div>
<NuxtChild keep-alive :keep-alive-props="{ exclude: ['modal'] }" :nuxt-child-key="$route.slug" />
</div>
</template>
<script>
export default {
transition: 'page' // or { name: 'page' }
}
</script>
<NuxtLink>
コンポーネント
グローバルなNuxtLinkコンポーネントの構文と機能のほとんどは同じです。ショートカットの<NLink>
形式を使用していた場合は、これを<NuxtLink>
を使用するように更新する必要があります。
<NuxtLink>
は、すべてのリンク(外部リンクを含む)のドロップイン代替になりました。詳細と、独自のリンクコンポーネントを提供するために拡張する方法については、こちらをご覧ください。
プログラムによるナビゲーション
Nuxt 2からNuxt 3に移行する場合、ユーザーをプログラムでナビゲートする方法を更新する必要があります。Nuxt 2では、this.$router
を使用して基になるVue Routerにアクセスできました。Nuxt 3では、Vue Routerにルートとパラメーターを渡すことができるnavigateTo()
ユーティリティメソッドを使用できます。
navigateTo
を常にawait
するか、関数から返すことでその結果をチェーンするようにしてください。<script>
export default {
methods: {
navigate(){
this.$router.push({
path: '/search',
query: {
name: 'first name',
type: '1'
}
})
}
}
}
</script>