コンテンツにスキップ

usePathname

usePathname は、現在の URL の **pathname** を読み込むことができる **Client Component** のフックです。

知っておくと良いこと: cacheComponents が有効になっている場合、ルートに動的パラメータがある場合、usePathnameSuspense の境界を必要とする可能性があります。generateStaticParams を使用する場合、Suspense の境界はオプションです。

app/example-client-component.tsx
'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 内のルートにインポートされている場合、ルーターがまだ初期化されていない場合、usePathnamenull を返す可能性があることに注意してください。これは、フォールバックルート の場合や、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'

ルート変更に応じた処理

app/example-client-component.tsx
'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 に依存する小さな、分離された部分のみにするように設計してください。サーバーで安定したフォールバックをレンダリングし、マウント後にその部分を更新します。

app/example-client-component.tsx
'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.0usePathname が導入されました。