コンテンツにスキップ

useRouter

useRouterフックを使用すると、クライアントコンポーネント内でプログラムによってルートを変更できます。

推奨: useRouterを使用する特別な要件がない限り、ナビゲーションには<Link>コンポーネントを使用してください。

app/example-client-component.tsx
'use client'
 
import { useRouter } from 'next/navigation'
 
export default function Page() {
  const router = useRouter()
 
  return (
    <button type="button" onClick={() => router.push('/dashboard')}>
      Dashboard
    </button>
  )
}

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(): ブラウザの履歴スタックの次のページに進みます。

知っておくと良いこと:

  • <Link>コンポーネントは、ビューポートに表示されるとルートを自動的にプリフェッチします。
  • フェッチリクエストがキャッシュされている場合、refresh()は同じ結果を再生成する可能性があります。 cookiesheadersなどの他の動的APIもレスポンスを変更する可能性があります。

next/routerからの移行

  • App Routerを使用する場合、useRouterフックはnext/routerではなくnext/navigationからインポートする必要があります
  • pathname文字列は削除され、usePathname()に置き換えられました
  • queryオブジェクトは削除され、useSearchParams()に置き換えられました
  • router.eventsは置き換えられました。以下を参照してください。

完全な移行ガイドを表示.

ルーターイベント

usePathnameuseSearchParams などの他のクライアントコンポーネントフックを組み合わせることで、ページ変更をリッスンできます。

app/components/navigation-events.js
'use client'
 
import { useEffect } from 'react'
import { usePathname, useSearchParams } from 'next/navigation'
 
export function NavigationEvents() {
  const pathname = usePathname()
  const searchParams = useSearchParams()
 
  useEffect(() => {
    const url = `${pathname}?${searchParams}`
    console.log(url)
    // You can now use the current URL
    // ...
  }, [pathname, searchParams])
 
  return '...'
}

これはレイアウトにインポートできます。

app/layout.js
import { Suspense } from 'react'
import { NavigationEvents } from './components/navigation-events'
 
export default function Layout({ children }) {
  return (
    <html lang="en">
      <body>
        {children}
 
        <Suspense fallback={null}>
          <NavigationEvents />
        </Suspense>
      </body>
    </html>
  )
}

知っておくと良いこと: <NavigationEvents>Suspense 境界 でラップされています。なぜなら、useSearchParams()静的レンダリング 中に最も近い Suspense 境界までクライアントサイドレンダリングを引き起こすからです。 詳細はこちら

スクロールトップの無効化

デフォルトでは、Next.js は新しいルートに移動するとページの先頭にスクロールします。 router.push() または router.replace()scroll: false を渡すことで、この動作を無効にできます。

app/example-client-component.tsx
'use client'
 
import { useRouter } from 'next/navigation'
 
export default function Page() {
  const router = useRouter()
 
  return (
    <button
      type="button"
      onClick={() => router.push('/dashboard', { scroll: false })}
    >
      Dashboard
    </button>
  )
}

バージョン履歴

バージョン変更点
v13.0.0next/navigation から useRouter が導入されました。