usePathname
usePathname は、現在の URL の **pathname** を読み込むことができる **Client Component** のフックです。
知っておくと良いこと:
cacheComponentsが有効になっている場合、ルートに動的パラメータがある場合、usePathnameはSuspenseの境界を必要とする可能性があります。generateStaticParamsを使用する場合、Suspenseの境界はオプションです。
'use client'
import { usePathname } from 'next/navigation'
export default function ExampleClientComponent() {
const pathname = usePathname()
return <p>Current pathname: {pathname}</p>
}usePathname は意図的に Client Component での使用を必要とします。Client Component は最適化解除ではありません。Server Components アーキテクチャの不可欠な部分です。
例えば、usePathname を使用する Client Component は、初期ページロード時に HTML としてレンダリングされます。新しいルートにナビゲートする際、このコンポーネントを再フェッチする必要はありません。代わりに、コンポーネントは一度ダウンロードされ(クライアント JavaScript バンドルで)、現在の状態に基づいて再レンダリングされます。
知っておくと良いこと:
- Server Component から現在の URL を読み込むことはサポートされていません。この設計は、レイアウト状態がページナビゲーション間で保持されるように意図されたものです。
- ページが静的にプリレンダリングされており、アプリに `next.config` の rewrites または Proxy ファイルがある場合、
usePathname()で pathname を読み込むと、ハイドレーションミスマッチエラーが発生する可能性があります。これは、初期値がサーバーから取得され、ルーティング後の実際のブラウザの pathname と一致しない場合があるためです。この問題を軽減する方法については、例 を参照してください。
Pages Router との互換性
usePathname を使用するコンポーネントがあり、それらが Pages Router 内のルートにインポートされている場合、ルーターがまだ初期化されていない場合、usePathname が null を返す可能性があることに注意してください。これは、フォールバックルート の場合や、Pages Router の Automatic Static Optimization 中に発生する可能性があります。
ルーティングシステム間の互換性を向上させるため、プロジェクトに app ディレクトリと pages ディレクトリの両方が含まれている場合、Next.js は usePathname の戻り値を自動的に調整します。
Parameters
const pathname = usePathname()usePathname はパラメータを取りません。
戻り値
usePathname は、現在の URL の pathname の文字列を返します。例:
| URL | 返される値 |
|---|---|
/ | '/' |
/dashboard | '/dashboard' |
/dashboard?v=2 | '/dashboard' |
/blog/hello-world | '/blog/hello-world' |
例
ルート変更に応じた処理
'use client'
import { useEffect } from 'react'
import { usePathname, useSearchParams } from 'next/navigation'
function ExampleClientComponent() {
const pathname = usePathname()
const searchParams = useSearchParams()
useEffect(() => {
// Do something here...
}, [pathname, searchParams])
}リライトによるハイドレーションミスマッチの回避
ページがプリレンダリングされると、HTML はソースの pathname に対して生成されます。その後、ページが `next.config` または `Proxy` を使用したリライト経由で到達した場合、ブラウザの URL が異なる可能性があり、クライアントでは usePathname() はリライトされた pathname を読み取ります。
ハイドレーションミスマッチを避けるには、UI を、クライアントの pathname に依存する小さな、分離された部分のみにするように設計してください。サーバーで安定したフォールバックをレンダリングし、マウント後にその部分を更新します。
'use client'
import { useEffect, useState } from 'react'
import { usePathname } from 'next/navigation'
export default function PathnameBadge() {
const pathname = usePathname()
const [clientPathname, setClientPathname] = useState('')
useEffect(() => {
setClientPathname(pathname)
}, [pathname])
return (
<p>
Current pathname: <span>{clientPathname}</span>
</p>
)
}| バージョン | 変更履歴 |
|---|---|
v13.0.0 | usePathname が導入されました。 |
役に立ちましたか?