useRouter
useRouter
フックを使用すると、クライアントコンポーネント内でプログラム的にルートを変更できます。
推奨事項: 特に
useRouter
を使用する必要がない限り、ナビゲーションには<Link>
コンポーネントを使用してください。
useRouter()
router.push(href: string, { scroll: boolean })
: 指定されたルートへクライアントサイドナビゲーションを実行します。ブラウザの履歴スタックに新しいエントリを追加します。router.replace(href: string, { scroll: boolean })
: 指定されたルートへクライアントサイドナビゲーションを実行しますが、ブラウザの履歴スタックに新しいエントリを追加しません。router.refresh()
: 現在のルートを更新します。サーバーに新しいリクエストを送信し、データリクエストを再取得し、サーバーコンポーネントを再レンダリングします。クライアントは影響を受けないクライアントサイドの React(例:useState
)やブラウザの状態(例: スクロール位置)を失うことなく、更新された React サーバーコンポーネントのペイロードをマージします。router.prefetch(href: string)
: クライアントサイドの遷移を高速化するため、指定されたルートをプリフェッチします。router.back()
: ブラウザの履歴スタックで前のルートに戻ります。router.forward()
: ブラウザの履歴スタックで次のページに進みます。
知っておくと良いこと:
router.push
やrouter.replace
に信頼できないまたはサニタイズされていない URL を送信してはいけません。これはサイトをクロスサイトスクリプティング(XSS)の脆弱性にさらす可能性があります。例えば、javascript:
URL をrouter.push
やrouter.replace
に送信すると、ページのコンテキストで実行されます。<Link>
コンポーネントは、ビューポート内で表示されたルートを自動的にプリフェッチします。- フェッチリクエストがキャッシュされている場合、
refresh()
は同じ結果を再生成する可能性があります。cookies
やheaders
などの他の動的 API もレスポンスを変更する可能性があります。
next/router
からの移行
- App Router を使用する場合、
useRouter
フックはnext/router
ではなくnext/navigation
からインポートする必要があります pathname
文字列は削除され、usePathname()
に置き換えられましたquery
オブジェクトは削除され、useSearchParams()
に置き換えられましたrouter.events
は置き換えられました。下記を参照
例
ルーターイベント
usePathname
や useSearchParams
などの他のクライアントコンポーネントフックを組み合わせることで、ページ変更を監視できます。
これはレイアウトにインポートできます。
知っておくと良いこと:
useSearchParams()
は静的レンダリング中に、最も近いSuspense
バウンダリまでクライアントサイドレンダリングを引き起こすため、<NavigationEvents>
はSuspense
バウンダリでラップされています。詳細はこちら。
トップへのスクロールを無効化
デフォルトでは、Next.js は新しいルートにナビゲートする際にページのトップにスクロールします。この動作を無効にするには、router.push()
または router.replace()
に scroll: false
を渡します。
バージョン履歴
バージョン | 変更内容 |
---|---|
v13.0.0 | next/navigation からの useRouter が導入されました。 |