brand logo

ドキュメント

navigateTo

navigateToは、プログラム的にユーザーをナビゲートするためのヘルパー関数です。

使用法

navigateToはサーバーサイドとクライアントサイドの両方で利用可能です。Nuxtコンテキスト内、または直接使用してページナビゲーションを実行できます。

navigateToを呼び出す際は、必ずその結果に対してawaitまたはreturnを使用してください。

navigateToはNitroルート内では使用できません。Nitroルート内でサーバーサイドリダイレクトを行うには、代わりにsendRedirectを使用してください。

Vueコンポーネント内で

// 'to'を文字列として渡す
await navigateTo('/search')

// ... またはルートオブジェクトとして
await navigateTo({ path: '/search' })

// ... またはクエリパラメータを含むルートオブジェクトとして
await navigateTo({
  path: '/search',
  query: {
    page: 1,
    sort: 'asc'
  }
})

ルートミドルウェア内で

export default defineNuxtRouteMiddleware((to, from) => {
  if (to.path !== '/search') {
    // リダイレクトコードを'301 Moved Permanently'に設定
    return navigateTo('/search', { redirectCode: 301 })
  }
})

ルートミドルウェア内でnavigateToを使用する場合、ミドルウェアの実行フローが正しく動作するように、その結果を返す必要があります。

例えば、次の実装は期待通りに動作しません

export default defineNuxtRouteMiddleware((to, from) => {
  if (to.path !== '/search') {
    // ❌ これは期待通りに動作しません
    navigateTo('/search', { redirectCode: 301 })
    return
  }
})

この場合、navigateToは実行されますが返されないため、予期しない動作を引き起こす可能性があります。

こちらも参照 guide > directory-structure > middleware

外部URLへのナビゲーション

navigateToexternalパラメータは、URLへのナビゲーションの方法に影響を与えます:

  • external: trueがない場合

    • 内部URLは期待通りにナビゲートします。
    • 外部URLはエラーをスローします。
  • external: trueがある場合

    • 内部URLはフルページリロードでナビゲートします。
    • 外部URLは期待通りにナビゲートします。

// エラーをスローします;
// デフォルトでは外部URLへのナビゲーションは許可されていません
await navigateTo('https://nuxt.com')

// 'external'パラメータを'true'に設定すると正常にリダイレクトします
await navigateTo('https://nuxt.com', {
  external: true
})

新しいタブでページを開く

// 'https://nuxt.com'を新しいタブで開きます
await navigateTo('https://nuxt.com', {
  open: {
    target: '_blank',
    windowFeatures: {
      width: 500,
      height: 500
    }
  }
})

function navigateTo(
  to: RouteLocationRaw | undefined | null,
  options?: NavigateToOptions
) => Promise<void | NavigationFailure | false> | false | void | RouteLocationRaw 

interface NavigateToOptions {
  replace?: boolean
  redirectCode?: number
  external?: boolean
  open?: OpenOptions
}

type OpenOptions = {
  target: string
  windowFeatures?: OpenWindowFeatures
}

type OpenWindowFeatures = {
  popup?: boolean
  noopener?: boolean
  noreferrer?: boolean
} & XOR<{ width?: number }, { innerWidth?: number }>
  & XOR<{ height?: number }, { innerHeight?: number }>
  & XOR<{ left?: number }, { screenX?: number }>
  & XOR<{ top?: number }, { screenY?: number }>

パラメータ

to

: RouteLocationRaw | undefined | null

デフォルト: '/'

toはリダイレクト先のプレーンな文字列またはルートオブジェクトです。undefinedまたはnullとして渡された場合、デフォルトで'/'になります。

// URLを直接渡すと'/blog'ページにリダイレクトします
await navigateTo('/blog')

// ルートオブジェクトを使用すると、名前が'blog'のルートにリダイレクトします
await navigateTo({ name: 'blog' })

// ルートオブジェクトを使用してパラメータ(id = 1)を渡しながら'product'ルートにリダイレクトします。
await navigateTo({ name: 'product', params: { id: 1 } })

options (オプション)

: NavigateToOptions

以下のプロパティを受け入れるオブジェクト:

  • replace

    • : boolean

    • デフォルト: false

    • デフォルトでは、navigateToはクライアントサイドのVue Routerインスタンスに与えられたルートをプッシュします。

      この動作は、replacetrueに設定することで変更でき、与えられたルートが置き換えられることを示します。

  • redirectCode

    • : number

    • デフォルト: 302

    • navigateToは与えられたパスにリダイレクトし、サーバーサイドでリダイレクトが行われる場合、デフォルトでリダイレクトコードを302 Foundに設定します。

      このデフォルトの動作は、異なるredirectCodeを提供することで変更できます。一般的に、301 Moved Permanentlyが恒久的なリダイレクトに使用されます。

  • external

    • : boolean

    • デフォルト: false

    • trueに設定すると、外部URLへのナビゲーションを許可します。それ以外の場合、navigateToはエラーをスローします。デフォルトでは外部ナビゲーションは許可されていません。

  • open

    • : OpenOptions

    • URLをウィンドウのopen()メソッドを使用してナビゲートすることを許可します。このオプションはクライアントサイドでのみ適用され、サーバーサイドでは無視されます。

      以下のプロパティを受け入れるオブジェクト:

    • target

      • : string

      • デフォルト: '_blank'

      • リソースが読み込まれるブラウジングコンテキストの名前を指定する、空白のない文字列。

    • windowFeatures

      • : OpenWindowFeatures

      • 以下のプロパティを受け入れるオブジェクト:

        プロパティ説明
        popupbooleanブラウザが決定するUI機能を持つ最小限のポップアップウィンドウを要求します。
        width または innerWidthnumberスクロールバーを含むコンテンツ領域の幅(最小100ピクセル)を指定します。
        height または innerHeightnumberスクロールバーを含むコンテンツ領域の高さ(最小100ピクセル)を指定します。
        left または screenXnumber画面の左端に対する新しいウィンドウの水平位置を設定します。
        top または screenYnumber画面の上端に対する新しいウィンドウの垂直位置を設定します。
        noopenerboolean新しいウィンドウがwindow.openerを介して元のウィンドウにアクセスするのを防ぎます。
        noreferrerbooleanRefererヘッダーの送信を防ぎ、暗黙的にnoopenerを有効にします。

        windowFeaturesプロパティの詳細については、ドキュメントを参照してください。

tips

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

navigateToの補足解説:Nuxtでのページ遷移を自在にコントロールする

Nuxtアプリケーションでのページ遷移は、ユーザー体験を左右する重要な要素です。navigateToは、プログラム的にページを遷移させるための便利な関数で、サーバーサイドレンダリング(SSR)とクライアントサイドレンダリング(CSR)の両方で動作します。これにより、ユーザーの操作やアプリケーションの状態に応じて柔軟に画面遷移を制御できるため、UXの向上やリダイレクト処理の簡素化に役立ちます。

しかし、単に使うだけではなく、適切な使いどころや注意点を理解しておくことが重要です。本記事では、navigateToの基本から実務での活用例、よくある落とし穴まで丁寧に解説します。


まず結論:navigateToのポイントまとめ

  • サーバー・クライアント両方で使えるため、SSR時のリダイレクトやCSR時の画面遷移に対応可能
  • 必ずawaitまたはreturnで結果を扱うことで、遷移処理の完了を正しく待機できる
  • 外部URLへの遷移はexternal: trueを指定しないとエラーになるため注意が必要
  • ルートミドルウェア内で使う場合は結果を返すことが必須で、返さないと期待通りに動作しない
  • 新しいタブで開くなどのオプションも充実しており、細かい挙動を制御可能

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

使うべきケース

  • ユーザーの操作に応じて動的にページ遷移を行いたいとき
  • サーバーサイドで条件に応じてリダイレクトを実装したいとき(例:認証チェック後のリダイレクト)
  • ルートミドルウェア内でアクセス制御やリダイレクトを行うとき
  • 外部サイトへの遷移をプログラム的に制御したいとき(external: true指定)
  • 新しいウィンドウやタブでページを開く必要があるとき

使わない方がよいケース

  • Nitroサーバールート内でのリダイレクト(この場合はsendRedirectを使う)
  • 単純なリンク遷移であれば、<NuxtLink><a>タグを使う方がパフォーマンス面で優れる
  • 非同期処理の完了を待たずに遷移を行いたい場合(awaitを使わないと挙動が不安定になることがある)

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

1. 認証チェック後のリダイレクト(ルートミドルウェア内)

export default defineNuxtRouteMiddleware(async (to, from) => {
  const user = await useCurrentUser()
  if (!user && to.path !== '/login') {
    // ここで必ずreturnすることが重要
    return navigateTo('/login', { redirectCode: 302 })
  }
})

認証されていないユーザーをログインページにリダイレクトする典型的な例です。returnを忘れるとリダイレクトが正しく機能しません。


2. クエリパラメータ付きのページ遷移

async function goToSearch() {
  await navigateTo({
    path: '/search',
    query: { q: 'nuxt', page: '1' }
  })
}

検索ページなど、クエリパラメータを含めて遷移したい場合に便利です。


3. 外部サイトを新しいタブで開く

await navigateTo('https://nuxt.com', {
  external: true,
  open: {
    target: '_blank',
    windowFeatures: {
      width: 800,
      height: 600,
      noopener: true,
      noreferrer: true
    }
  }
})

外部URLを新しいウィンドウやタブで開く際に使います。noopenernoreferrerを指定することでセキュリティ面も配慮できます。


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

1. awaitまたはreturnを忘れると遷移が完了しない

navigateToは非同期関数なので、結果を待たずに処理を進めると意図しない挙動になります。特にミドルウェア内では必ずreturnしてください。

2. Nitroルート内では使えない

サーバーサイドのAPIエンドポイント(Nitroルート)内でnavigateToを使うとエラーになります。APIからのリダイレクトはsendRedirectを使いましょう。

3. 外部URL遷移はexternal: trueが必須

デフォルトでは外部URLへの遷移はエラーになるため、外部サイトに遷移する場合は必ずexternal: trueを指定してください。

4. SSRとCSRでの挙動の違いに注意

SSR時はHTTPステータスコードを伴うリダイレクトが可能ですが、CSR時はVue Routerの遷移となります。redirectCodeはSSR時のみ有効です。

5. パフォーマンスへの影響

頻繁にnavigateToを使ってページ遷移を行う場合、不要なリロードや再レンダリングが発生しないように設計しましょう。特にexternal: trueを使うとフルページリロードになるため注意が必要です。


まとめ

navigateToはNuxtでのページ遷移をプログラム的に制御する強力なツールです。SSR・CSR両対応で柔軟に使え、認証リダイレクトや外部リンクの制御、新しいタブでのオープンなど多彩な用途に対応します。ただし、awaitreturnの扱い、Nitroルートでの非対応、外部URLの扱いなど、いくつかの注意点を押さえておくことが重要です。

これらを理解し適切に使いこなすことで、NuxtアプリケーションのUXを向上させ、堅牢でメンテナブルなコードを書くことができます。ぜひ実務での活用に役立ててください。


navigateToはVue Routerのrouter.pushrouter.replaceのラッパー的存在ですが、SSR対応やリダイレクトコードの指定などNuxt特有の機能が追加されています。公式ドキュメントと本記事のポイントを合わせて理解するとより効果的に使えます。