useSearchParams
`useSearchParams`は、現在のURLの**クエリ文字列**を読み取ることを可能にする**クライアントコンポーネント**フックです。
`useSearchParams`は、URLSearchParams
インターフェースの**読み取り専用**バージョンを返します。
'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}</>
}
パラメータ
const searchParams = useSearchParams()
`useSearchParams`はパラメータを取りません。
戻り値
`useSearchParams`は、URLのクエリ文字列を読み取るためのユーティリティメソッドを含むURLSearchParams
インターフェースの**読み取り専用**バージョンを返します
-
URLSearchParams.get()
: 検索パラメータに関連付けられた最初の値を返します。例:URL searchParams.get("a")
/dashboard?a=1
'1'
/dashboard?a=
''
/dashboard?b=3
null
/dashboard?a=1&a=2
'1'
- すべての値を取得するにはgetAll()
を使用* -
URLSearchParams.has()
: 指定されたパラメータが存在するかどうかを示すブール値を返します。例:URL searchParams.has("a")
/dashboard?a=1
true
/dashboard?b=3
false
-
URLSearchParams
の他の**読み取り専用**メソッド(getAll()
、keys()
、values()
、entries()
、forEach()
、およびtoString()
を含む)について詳しくはこちらをご覧ください。
知っておくと良いこと:
- `useSearchParams`はクライアントコンポーネントフックであり、部分レンダリング中の古い値の発生を防ぐため、サーバーコンポーネントではサポートされていません。
- アプリケーションに
/pages
ディレクトリが含まれている場合、useSearchParams
はReadonlyURLSearchParams | null
を返します。null
値は、getServerSideProps
を使用しないページのプリレンダリング中に検索パラメータが不明であるため、移行中の互換性のためのものです。
動作
静的レンダリング
ルートが静的にレンダリングされる場合、useSearchParams
を呼び出すと、最も近いSuspense
境界までのクライアントコンポーネントツリーがクライアントサイドでレンダリングされます。
これにより、ルートの一部を静的にレンダリングしながら、useSearchParams
を使用する動的な部分をクライアントサイドでレンダリングすることができます。
useSearchParams
を使用するクライアントコンポーネントを<Suspense/>
境界でラップすることをお勧めします。これにより、その上のすべてのクライアントコンポーネントを静的にレンダリングし、初期HTMLの一部として送信できます。例。
例:
'use client'
import { useSearchParams } from 'next/navigation'
export default function SearchBar() {
const searchParams = useSearchParams()
const search = searchParams.get('search')
// This will not be logged on the server when using static rendering
console.log(search)
return <>Search: {search}</>
}
import { Suspense } from 'react'
import SearchBar from './search-bar'
// This component passed as a fallback to the Suspense boundary
// will be rendered in place of the search bar in the initial HTML.
// When the value is available during React hydration the fallback
// will be replaced with the `<SearchBar>` component.
function SearchBarFallback() {
return <>placeholder</>
}
export default function Page() {
return (
<>
<nav>
<Suspense fallback={<SearchBarFallback />}>
<SearchBar />
</Suspense>
</nav>
<h1>Dashboard</h1>
</>
)
}
動的レンダリング
ルートが動的にレンダリングされる場合、useSearchParams
はクライアントコンポーネントの初期サーバーレンダリング中にサーバー上で利用可能になります。
例:
'use client'
import { useSearchParams } from 'next/navigation'
export default function SearchBar() {
const searchParams = useSearchParams()
const search = searchParams.get('search')
// This will be logged on the server during the initial render
// and on the client on subsequent navigations.
console.log(search)
return <>Search: {search}</>
}
import SearchBar from './search-bar'
export const dynamic = 'force-dynamic'
export default function Page() {
return (
<>
<nav>
<SearchBar />
</nav>
<h1>Dashboard</h1>
</>
)
}
知っておくと良いこと:
dynamic
ルートセグメント設定オプションをforce-dynamic
に設定することで、動的レンダリングを強制することができます。
サーバーコンポーネント
ページ
ページ (サーバーコンポーネント) で検索パラメータにアクセスするには、searchParams
プロップを使用します。
レイアウト
ページとは異なり、レイアウト (サーバーコンポーネント) はsearchParams
プロップを受け取りません。これは、共有レイアウトがナビゲーション中に再レンダリングされないため、ナビゲーション間でsearchParams
が古くなる可能性があるためです。詳細な説明を参照してください。
代わりに、ページsearchParams
プロップまたはクライアントコンポーネントのuseSearchParams
フックを使用してください。これらはクライアントで最新のsearchParams
と共に再レンダリングされます。
例
searchParams
の更新
新しいsearchParams
を設定するには、useRouter
またはLink
を使用できます。ナビゲーションが実行されると、現在のpage.js
は更新されたsearchParams
プロップを受け取ります。
'use client'
export default function ExampleClientComponent() {
const router = useRouter()
const pathname = usePathname()
const searchParams = useSearchParams()
// Get a new searchParams string by merging the current
// searchParams with a provided key/value pair
const createQueryString = useCallback(
(name: string, value: string) => {
const params = new URLSearchParams(searchParams.toString())
params.set(name, value)
return params.toString()
},
[searchParams]
)
return (
<>
<p>Sort By</p>
{/* using useRouter */}
<button
onClick={() => {
// <pathname>?sort=asc
router.push(pathname + '?' + createQueryString('sort', 'asc'))
}}
>
ASC
</button>
{/* using <Link> */}
<Link
href={
// <pathname>?sort=desc
pathname + '?' + createQueryString('sort', 'desc')
}
>
DESC
</Link>
</>
)
}
バージョン履歴
バージョン | 変更点 |
---|---|
v13.0.0 | `useSearchParams`を導入。 |
これは役に立ちましたか?