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()
: ブラウザの履歴スタックで次のページに進みます。
知っておくと良いこと:
- 信頼できない、またはサニタイズされていないURLを
router.push
またはrouter.replace
に送信してはいけません。これは、サイトをクロスサイトスクリプティング(XSS)の脆弱性にさらす可能性があります。たとえば、router.push
またはrouter.replace
に送信されたjavascript:
URLは、ページ内で実行されます。<Link>
コンポーネントは、ビューポートに表示されると、ルートを自動的にプリフェッチします。- フェッチリクエストがキャッシュされている場合、
refresh()
は同じ結果を再現する可能性があります。cookies
やheaders
などの他のDynamic APIもレスポンスを変更する可能性があります。
next/router
からの移行
- App Routerを使用する場合、
useRouter
フックはnext/router
ではなくnext/navigation
からインポートする必要があります。 pathname
文字列は削除され、usePathname()
に置き換えられました。query
オブジェクトは削除され、useSearchParams()
に置き換えられました。router.events
は置き換えられました。以下を参照してください。
例
ルーターイベント
usePathname
やuseSearchParams
などの他のクライアントコンポーネントフックを組み合わせることで、ページ変更をリッスンできます。
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>
)
}
知っておくと良いこと:
useSearchParams()
は静的レンダリング中に最も近いSuspense
境界までクライアントサイドレンダリングを引き起こすため、<NavigationEvents>
は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.0 | next/navigation からuseRouter が導入されました。 |
この情報は役に立ちましたか?