brand logo

ドキュメント

onBeforeRouteUpdate

onBeforeRouteUpdate コンポーザブルは、コンポーネント内でルートガードを登録することを可能にします。

こちらも参照 Vue Router ドキュメント

tips

このセクションは公式ドキュメントの翻訳ではなく、本サイト独自の補足記事です。

onBeforeRouteUpdate の活用と注意点

Nuxt アプリケーションでページ遷移が発生するとき、特に同じコンポーネントが再利用されるケースでは、ルートのパラメータやクエリが変わってもコンポーネントの再マウントは行われません。このとき、ルートの更新を検知して何らかの処理を行いたい場合に役立つのが onBeforeRouteUpdate です。

この補足記事では、onBeforeRouteUpdate の基本的な使い方から、実務での活用例、注意すべきポイントまでを詳しく解説します。Nuxt でのルーティング制御をより柔軟にしたい方にとって必須の知識となるでしょう。


まず結論:onBeforeRouteUpdate のポイント

  • ルートが更新される直前に処理を挟める Vue Router のフックを Nuxt で使える
  • 同じコンポーネントが再利用される場合に、パラメータやクエリの変化を検知して処理を実行可能
  • 非同期処理やキャンセルも対応できるため、API再取得や状態リセットに便利
  • 使い方はコンポーネント内で onBeforeRouteUpdate((to, from, next) => {}) の形で登録する
  • ルート更新時の副作用を管理しやすく、ユーザー体験の向上に貢献する

いつ使うべきか・使わない方がよいケース

使うべきケース

  • 同じページコンポーネント内でルートパラメータ(例:IDやページ番号)が変わるときにデータを再取得したい
  • クエリパラメータの変更に応じて表示内容を切り替えたい場合
  • ルート遷移前に確認ダイアログやキャンセル処理を挟みたいとき
  • ページの状態をリセットしたり、スクロール位置を調整したい場合

使わない方がよいケース

  • 完全に別のページに遷移する場合(この場合は通常の onBeforeRouteLeavewatch で十分)
  • ルート更新のたびに重い処理を行うとパフォーマンスが悪化する恐れがある場合
  • ルート更新を検知するだけなら、watch$route を監視する方法でも代替可能

実務でよくあるユースケースとサンプルコード

1. IDパラメータが変わったら API を再取得する

import { onBeforeRouteUpdate } from 'vue-router'
import { ref } from 'vue'

const data = ref(null)

async function fetchData(id) {
  // APIコールの例
  const res = await fetch(`/api/items/${id}`)
  data.value = await res.json()
}

// 初回ロード時にデータ取得
fetchData(useRoute().params.id)

onBeforeRouteUpdate((to, from, next) => {
  fetchData(to.params.id).then(() => {
    next()
  }).catch(() => {
    next(false) // エラー時は遷移キャンセル
  })
})

2. クエリパラメータの変更でフィルターを更新する

import { onBeforeRouteUpdate } from 'vue-router'
import { ref } from 'vue'

const filter = ref('')

function updateFilter(query) {
  filter.value = query.filter || ''
}

// 初期値セット
updateFilter(useRoute().query)

onBeforeRouteUpdate((to, from, next) => {
  updateFilter(to.query)
  next()
})

3. ルート更新前に確認ダイアログを表示する

import { onBeforeRouteUpdate } from 'vue-router'

onBeforeRouteUpdate((to, from, next) => {
  if (window.confirm('ページを離れてもよろしいですか?')) {
    next()
  } else {
    next(false)
  }
})

よくある落とし穴・注意点

SSR と Hydration の影響

onBeforeRouteUpdate はクライアントサイドでのルート更新時に発火します。サーバーサイドレンダリング(SSR)時には呼ばれないため、初期データの取得は asyncDatafetch で行い、クライアント側のルート更新時にのみ追加処理を行う設計が望ましいです。

パフォーマンスへの配慮

ルート更新時に重い処理を行うと、ユーザーの操作感が悪化します。非同期処理は適切にキャンセルやスロットリングを検討し、必要最低限の処理に留めましょう。

next() の呼び出し忘れ

onBeforeRouteUpdate のコールバック内で next() を呼ばないとルート遷移が止まってしまいます。非同期処理を行う場合は、必ず成功・失敗のいずれかで next() または next(false) を呼び出すことを忘れないでください。

ルートの再利用に注意

同じコンポーネントが使われるルート更新時にのみ発火するため、完全に別のページに遷移する場合は発火しません。用途に応じて onBeforeRouteLeavewatch と組み合わせて使うと良いでしょう。


まとめ

onBeforeRouteUpdate は Nuxt で同じコンポーネントが再利用されるルート更新時に、柔軟に処理を挟める強力なフックです。APIの再取得や状態管理、ユーザー確認など、実務で頻繁に求められる要件をシンプルに実装できます。

ただし、SSRとの関係やパフォーマンス面での注意も必要です。適切に使い分けることで、より快適で堅牢な Nuxt アプリケーションを構築できるでしょう。


onBeforeRouteUpdate は Vue Router の機能を Nuxt で活用するための橋渡し的存在です。Vue Router の公式ドキュメントも併せて参照すると理解が深まります。