概要
useSearchParams
は、URLSearchParams
インターフェースの読み取り専用バージョンを返します。これにより、URLのクエリパラメータを取得できます。ただし、useSearchParams
はサーバーコンポーネントではサポートされていないため、クライアントサイドでのみ使用可能です。
使用方法
以下は、useSearchParams
を使用してURLのクエリパラメータを取得する例です。
'use client'
import { useSearchParams } from 'next/navigation'
export default function SearchBar() {
const searchParams = useSearchParams()
const search = searchParams.get('search')
// URL -> `/dashboard?search=my-project`
// `search` -> 'my-project'
return <>Search: {search}</>
}
クエリパラメータの取得
useSearchParams
は、以下のメソッドを提供しています:
-
get()
: 指定したクエリパラメータの最初の値を返します -
has()
: 指定したクエリパラメータが存在するかどうかを返します
その他、getAll()
, keys()
, values()
, entries()
, forEach()
, toString()
などがあります
'use client'
import { useSearchParams } from 'next/navigation'
export default function SearchBar() {
const searchParams = useSearchParams()
const search = searchParams.get('search')
const hasSearch = searchParams.has('search')
console.log(search) // クライアントサイドでのログ
console.log(hasSearch) // クエリパラメータの存在確認
return (
<>
Search: {search}
{hasSearch ? ' - 検索結果あり' : ' - 検索結果なし'}
</>
)
}
静的レンダリング時の挙動
静的にレンダリングされたルートでuseSearchParams
を呼び出すと、最も近いSuspense
までのクライアントコンポーネントツリーがクライアントサイドでレンダリングされます。これにより、静的にレンダリングされた部分と動的にレンダリングされた部分を組み合わせることができます。
import { Suspense } from 'react'
import SearchBar from './search-bar'
// フォールバックとして使用されるコンポーネント
function SearchBarFallback() {
return <>placeholder</>
}
export default function Page() {
return (
<>
<nav>
<Suspense fallback={<SearchBarFallback />}>
<SearchBar />
</Suspense>
</nav>
<h1>Dashboard</h1>
</>
)
}
上記の例では、SearchBar
コンポーネントがSuspense境界でラップされており、初期HTMLではSearchBarFallback
が表示されます。Reactのハイドレーション中に値が利用可能になると、SearchBar
コンポーネントに置き換わります。
動的レンダリング時の挙動
動的にレンダリングされたルートでは、useSearchParams
がサーバーサイドの初期レンダー時に利用可能になります。
import SearchBar from './search-bar'
export const dynamic = 'force-dynamic'
export default function Page() {
return (
<>
<nav>
<SearchBar />
</nav>
<h1>Dashboard</h1>
</>
)
}