useRouter
アプリ内の任意の関数コンポーネントでrouter
オブジェクトにアクセスしたい場合は、useRouter
フックを使用できます。以下の例をご覧ください:
useRouter
はReactフックであるため、クラスでは使用できません。withRouterを使用するか、クラスを関数コンポーネントでラップできます。
useRouter
とwithRouter
の両方で返されるrouter
オブジェクトの定義は以下の通りです:
pathname
: String
- /pages
の後に続く現在のルートファイルのパス。したがって、basePath
、locale
、末尾のスラッシュ(trailingSlash: true
)は含まれません。
query
: Object
- オブジェクトに解析されたクエリ文字列。動的ルートのパラメーターを含みます。ページがサーバーサイドレンダリングを使用しない場合、プリレンダリング中は空のオブジェクトになります。デフォルトは{}
asPath
: String
- ブラウザに表示されるパス。検索パラメーターを含み、trailingSlash
の設定を尊重します。basePath
とlocale
は含まれません。
isFallback
: boolean
- 現在のページがフォールバックモードかどうか。
basePath
: String
- アクティブなbasePath(有効な場合)。
locale
: String
- アクティブなロケール(有効な場合)。
locales
: String[]
- サポートされているすべてのロケール(有効な場合)。
defaultLocale
: String
- 現在のデフォルトロケール(有効な場合)。
domainLocales
: Array<{domain, defaultLocale, locales}>
- 設定されているドメインロケール。
isReady
: boolean
- ルーターのフィールドがクライアント側で更新され、使用可能かどうか。useEffect
メソッド内でのみ使用し、サーバー上で条件付きレンダリングに使用しないでください。自動的に静的最適化されたページのユースケースについては、関連ドキュメントを参照してください。
isPreview
: boolean
- アプリケーションが現在プレビューモードかどうか。
サーバーサイドレンダリングまたは自動的な静的最適化を使用してページがレンダリングされる場合、asPath
フィールドを使用すると、クライアントとサーバー間で不一致が発生する可能性があります。isReady
フィールドがtrue
になるまで、asPath
の使用は避けてください。
router
内には以下のメソッドが含まれています:
クライアント側の遷移を処理します。このメソッドはnext/link
では不十分な場合に役立ちます。
url
: UrlObject | String
- 遷移先のURL(UrlObject
のプロパティについてはNode.JS URLモジュールのドキュメントを参照)。
as
: UrlObject | String
- オプションで、ブラウザのURLバーに表示されるパスの修飾子。Next.js 9.5.3より前は、これは動的ルートに使用されていました。
options
- 以下の設定オプションを持つオプションのオブジェクト:
外部URLに対してはrouter.push
を使用する必要はありません。window.locationがそのようなケースに適しています。
事前定義されたルートであるpages/about.js
に遷移:
動的ルートであるpages/post/[pid].js
に遷移:
認証が必要なページの場合に、ユーザーをpages/login.js
にリダイレクト:
Next.jsで同じページに遷移する場合、親コンポーネントが変更されていないため、デフォルトでページの状態はリセットされません。
上記の例では、/one
と/two
間の遷移で、カウントはリセットされません。トップレベルのReactコンポーネントPage
が同じであるため、useState
はレンダリング間で維持されます。
この動作を望まない場合、いくつかのオプションがあります:
next/link
で使用できるURLオブジェクトと同じ方法で使用できます。url
とas
の両方のパラメーターで機能します:
next/link
のreplace
プロパティと同様に、router.replace
は新しいURL入力をhistory
スタックに追加しません。
次の例を参照してください:
クライアント側の遷移を高速化するために、ページを先読みします。このメソッドは next/link
を使用しないナビゲーションでのみ役立ちます。next/link
はページの自動先読みを処理するためです。
これは本番環境専用の機能です。Next.jsは開発環境でページを先読みしません。
url
- 明示的なルート(例: /dashboard
)と動的ルート(例: /product/[id]
)を含む、先読みするURL
as
- url
のオプションの修飾子。Next.js 9.5.3 より前は、これを使用して動的ルートを先読みしていました。
options
- 次のフィールドを許可する省略可能なオブジェクト:
locale
- アクティブなロケールとは異なるロケールを指定できます。false
の場合、アクティブなロケールが使用されないため、url
にロケールを含める必要があります。
ログインページがあり、ログイン後にユーザーをダッシュボードにリダイレクトする場合を考えてみましょう。この場合、次の例のように、ダッシュボードを先読みしてより高速な遷移を実現できます:
(カスタムサーバーを使用している場合など)popstate をリッスンし、ルーターがそれに作用する前に何かを行いたい場合があります。
cb
- 受信した popstate
イベントで実行する関数。この関数はイベントの状態を次のプロパティを持つオブジェクトとして受け取ります:
url
: String
- 新しい状態のルート。これは通常、page
の名前です
as
: String
- ブラウザに表示されるURL
options
: Object
- router.pushによって送信された追加オプション
cb
が false
を返す場合、Next.jsルーターは popstate
を処理しません。その場合、処理は開発者の責任となります。ファイルシステムルーティングの無効化を参照してください。
beforePopState
を使用してリクエストを操作したり、SSRリフレッシュを強制したりできます。次の例を参照してください:
履歴を戻ります。ブラウザの戻るボタンをクリックするのと同等です。window.history.back()
を実行します。
現在のURLをリロードします。ブラウザの更新ボタンをクリックするのと同等です。window.location.reload()
を実行します。
Next.jsのルーター内で発生するさまざまなイベントをリッスンできます。サポートされているイベントは次のとおりです:
routeChangeStart(url, { shallow })
- ルートの変更が開始されたときに発生
routeChangeComplete(url, { shallow })
- ルートが完全に変更されたときに発生
routeChangeError(err, url, { shallow })
- ルートの変更中にエラーが発生した場合、またはルートの読み込みがキャンセルされた場合に発生
err.cancelled
- ナビゲーションがキャンセルされたかどうかを示します
beforeHistoryChange(url, { shallow })
- ブラウザの履歴を変更する前に発生
hashChangeStart(url, { shallow })
- ハッシュが変更されるが、ページは変更されない場合に発生
hashChangeComplete(url, { shallow })
- ハッシュが変更されたが、ページは変更されない場合に発生
補足: ここで url
はブラウザに表示されるURL であり、basePath
を含みます。
例えば、ルーターイベント routeChangeStart
をリッスンするには、pages/_app.js
を開くか作成し、次のようにイベントをサブスクライブします:
この例では、ページのナビゲーション時にアンマウントされないカスタムApp(pages/_app.js
)を使用してイベントをサブスクライブしていますが、アプリケーション内の任意のコンポーネントでルーターイベントをサブスクライブできます。
ルーターイベントは、コンポーネントのマウント時(useEffect または componentDidMount / componentWillUnmount)またはイベント発生時に命令的に登録する必要があります。
ルートの読み込みがキャンセルされた場合(例:2つのリンクを連続して素早くクリックした場合)、routeChangeError
が発生します。渡された err
には、次の例のように cancelled
プロパティが true
に設定されます:
これは同じ useRouter
フックですが、app
と pages
の両方のディレクトリで使用できます。
next/router
とは異なり、pagesルーターがマウントされていない場合にエラーをスローせず、代わりに戻り値の型が NextRouter | null
になります。
これにより、開発者は app
ルーターに移行する際に、両方の app
と pages
で実行できるようにコンポーネントを変換できます。
以前は次のようだったコンポーネントが:
next/compat/router
に変換する際にエラーが発生します。null
は分割代入できないためです。代わりに、開発者は新しいフックを活用できます:
このコンポーネントは、現在pages
とapp
ディレクトリの両方で動作します。コンポーネントがpages
で使用されなくなった場合、互換性のあるルーターへの参照を削除できます:
もう1つの特定のユースケースは、pages
ディレクトリのgetServerSideProps
内など、Next.jsアプリケーションコンテキスト外でコンポーネントをレンダリングする場合です。この場合、エラーを回避するために互換性のあるルーターを使用できます:
router
オブジェクト上の特定のメソッドはPromiseを返します。no-floating-promises ESLintルールが有効な場合、グローバルまたは影響を受ける行に対して無効にすることを検討してください。
アプリケーションにこのルールが必要な場合、Promiseをvoid
にするか、async
関数でawait
してから関数呼び出しを無効にする必要があります。これはonClick
ハンドラ内からメソッドが呼び出される場合は適用されません。
影響を受けるメソッドは:
router.push
router.replace
router.prefetch
useRouter
が最適でない場合、withRouter
も同じrouter
オブジェクトをどのコンポーネントにも追加できます。
クラスコンポーネントでwithRouter
を使用するには、コンポーネントがルーターのプロパティを受け入れる必要があります: