概要
-
next.js 12 から next.js 13 へのバージョンアップの大きな変更点の1つとして,ルーティングの方法が変更された点が挙げられます。next.js 12 では,"next/router" の
useRouterを使用していましたが,next.js 13 では,"next/navigation" のuseRouterを使用する必要があります。 -
この記事では,"next/navigation" を使用して表示しているURLの情報を取得する方法について解説します。
URL の情報を取得する
- URL の情報を取得する関数として,以下の3つがあります。
useSearchParamsusePathnameuseParams
- Next.js の公式の Pages ディレクトリから App ディレクトリへの移行に関する説明 では,以下のような記述があります。
- 新しい useRouter は,
pathnameの文字列が返しません。pathnameが必要なら,usePathnamehook を使用してください。- 新しい useRouter は,
queryオブジェクトを返しません。queryオブジェクトが必要なら,useSearchParamshook を使用してください。usePathnameとuseSearchParamsは一緒に使用できます。usePathnameとuseSearchParamsは,Client Componentでのみ使用できます。
- また,Next.js 13.3 から,
useParamshook が導入されました。この hook は,表示中のページの dynamic params を取得するために使用します。この hook は Pages ディレクトリで使用するとnullを返します。
動かしてみた
前提(共通)
- 動作環境は,next.js 13.3 です。
- それぞれのサンプルコードを表示するページに追加します。
- ページへのパスは,"/demo/[id]" とします。[id]は dynamic params です。
- ページへのアクセスのときは,"/demo/hoge?params1=fuga" をブラウザに入力します。
useSearchParams
import { useSearchParams } from 'next/navigation';
// 省略
const searchParams = useSearchParams()
console.log(searchParams)
// 省略
まずは,useSearchParams の結果です。ページにアクセスするときに付与したクエリパラメータが取得できることがわかります。
# /demo/hoge?params1=fuga にアクセスした結果
params1=fuga
useSearchParams で取得したパラメータは,以下のように取得できます。
const searchParams = useSearchParams()
const params1 = searchParams.get('params1')
usePathname
import { usePathname } from 'next/navigation';
// 省略
const pathname = usePathname()
console.log(pathname)
// 省略
次に,usePathname の結果です。アクセスしたときのパスが取得できることがわかります。このパスは,dynamic params を含みます。
# /demo/hoge?params1=fuga にアクセスした結果
/demo/hoge
useParams
import { useParams } from 'next/navigation';
// 省略
// useParams の戻り値はオブジェクト
const params = useParams()
console.log("result of useParams: %o", params)
// 省略
最後に,useParams の実行結果です。dynamic params である [id] が取得できていることが確認できました。
# /demo/hoge?params1=fuga にアクセスした結果
{id: 'hoge'}
取得したパラメータへのアクセスは,以下のようにできます。
const params = useParams()
const id = params.id
まとめ
URL の情報を取得する "next/navigation" の3つの hook を整理しました。
- usePathname: dynamic params を含むパスを取得
- useSearchParams: クエリパラメータを取得
- useParam: dynamic params を取得
誰かの参考になれば幸いです。