useSearchParams
useSearchParams
は現在のURLのクエリ文字列を読み取ることができるClient Componentフックです。
useSearchParams
は、URLSearchParams
インターフェイスの読み取り専用バージョンを返します。
- TypeScript
- JavaScript
'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}</>
}
'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}</>
}
Parameters
const searchParams = useSearchParams()
useSearchParams
はパラメータを一切受け取りません。
Returns
useSearchParams
は、URLSearchParams
インターフェイスの読み取り専用バージョンを返します。これにはURLのクエリ文字列を読み取るためのユーティリティメソッドが含まれています:
-
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()
が含まれます。
Good to know:
useSearchParams
はClient Componentフックであり、値の古さを防ぐためServer Componentsではサポートされていません部分的レンダリング。- アプリケーションに
/pages
ディレクトリが含まれている場合、useSearchParams
はReadonlyURLSearchParams | null
を返します。null
値は移行中の互換性のためであり、検索パラメータがgetServerSideProps
を使用しないページのプリレンダリングで知られることはできません。
Behavior
Static Rendering
ルートが静的にレンダリングされている場合、useSearchParams
を呼び出すと最も近いSuspense
境界までのClient Componentのツリーがクライアント側でレンダリングされます。
これにより、ルートの一部が静的にレンダリングされる一方で、useSearchParams
を使用する動的部分がクライアント側でレンダリングされます。
useSearchParams
を使用するClient Componentを<Suspense/>
境界でラップすることをお勧めします。これにより、その上のClient Componentが静的にレンダリングされ、初期HTMLの一部として送信されます。 例。
例えば:
- TypeScript
- JavaScript
'use client'
import { useSearchParams } from 'next/navigation'
export default function SearchBar() {
const searchParams = useSearchParams()
const search = searchParams.get('search')
// 静的レンダリングを使用する場合、このログはサーバーでは行われません
console.log(search)
return <>Search: {search}</>
}
'use client'
import { useSearchParams } from 'next/navigation'
export default function SearchBar() {
const searchParams = useSearchParams()
const search = searchParams.get('search')
// 静的レンダリングを使用する場合、このログはサーバーでは行われません
console.log(search)
return <>Search: {search}</>
}
- TypeScript
- JavaScript
import { Suspense } from 'react'
import SearchBar from './search-bar'
// このコンポーネントはSuspense境界にフォールバックとして渡され
// 検索バーの代わりに初期HTMLでレンダリングされます。
// Reactのハイドレーション時に値が利用可能な際、フォールバック
// は`<SearchBar>`コンポーネントに置き換えられます。
function SearchBarFallback() {
return <>placeholder</>
}
export default function Page() {
return (
<>
<nav>
<Suspense fallback={<SearchBarFallback />}>
<SearchBar />
</Suspense>
</nav>
<h1>Dashboard</h1>
</>
)
}
import { Suspense } from 'react'
import SearchBar from './search-bar'
// このコンポーネントはSuspense境界にフォールバックとして渡され
// 検索バーの代わりに初期HTMLでレンダリングされます。
// Reactのハイドレーション時に値が利用可能な際、フォールバック
// は`<SearchBar>`コンポーネントに置き換えられます。
function SearchBarFallback() {
return <>placeholder</>
}
export default function Page() {
return (
<>
<nav>
<Suspense fallback={<SearchBarFallback />}>
<SearchBar />
</Suspense>
</nav>
<h1>Dashboard</h1>
</>
)
}
Dynamic Rendering
ルートが動的にレンダリングされている場合、useSearchParams
はClient Componentの初期サーバーレンダリング中にサーバー上で利用可能です。
例えば:
- TypeScript
- JavaScript
'use client'
import { useSearchParams } from 'next/navigation'
export default function SearchBar() {
const searchParams = useSearchParams()
const search = searchParams.get('search')
// これは初期レンダリングでサーバーにログされ
// 以降のナビゲーションでクライアントにログされます
console.log(search)
return <>Search: {search}</>
}
'use client'
import { useSearchParams } from 'next/navigation'
export default function SearchBar() {
const searchParams = useSearchParams()
const search = searchParams.get('search')
// これは初期レンダリングでサーバーにログされ
// 以降のナビゲーションでクライアントにログされます
console.log(search)
return <>Search: {search}</>
}
- TypeScript
- JavaScript
import SearchBar from './search-bar'
export const dynamic = 'force-dynamic'
export default function Page() {
return (
<>
<nav>
<SearchBar />
</nav>
<h1>Dashboard</h1>
</>
)
}
import SearchBar from './search-bar'
export const dynamic = 'force-dynamic'
export default function Page() {
return (
<>
<nav>
<SearchBar />
</nav>
<h1>Dashboard</h1>
</>
)
}
Good to know:
dynamic
ルートセグメントのコンフィグオプションをforce-dynamic
に設定することで、動的レンダリングを強制することができます。
Server Components
Pages
Pages(Server Components)で検索パラメータにアクセスするためには、searchParams
プロップを使用してください。
Layouts
Pagesとは異なり、Layouts(Server Components)はsearchParams
プロップを受け取りません。これは、共有レイアウトがナビゲーション中に再レンダリングされないため、ナビゲーション間でsearchParams
が古くなる可能性を避けるためです。 詳細な説明をご覧ください。
代わりに、PageのsearchParams
プロップまたはClient Componentで再レンダリングされるuseSearchParams
フックをクライアント上で使用してください。これにより、クライアント側の最新のsearchParams
で更新されます。
Examples
searchParams
の更新
新しいsearchParams
を設定するには、useRouter
またはLink
を使用できます。ナビゲーションが実行されると、現在のpage.js
が更新されたsearchParams
プロップを受け取ります。
- TypeScript
- JavaScript
'use client'
export default function ExampleClientComponent() {
const router = useRouter()
const pathname = usePathname()
const searchParams = useSearchParams()
// 現在のsearchParamsを指定されたキー/値ペアでマージして
// 新しいsearchParams文字列を取得します
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>
{/* useRouterを使用して */}
<button
onClick={() => {
// <pathname>?sort=asc
router.push(pathname + '?' + createQueryString('sort', 'asc'))
}}
>
ASC
</button>
{/* <Link>を使用して */}
<Link
href={
// <pathname>?sort=desc
pathname + '?' + createQueryString('sort', 'desc')
}
>
DESC
</Link>
</>
)
}
'use client'
export default function ExampleClientComponent() {
const router = useRouter()
const pathname = usePathname()
const searchParams = useSearchParams()
// 現在のsearchParamsを指定されたキー/値ペアでマージして
// 新しいsearchParams文字列を取得します
const createQueryString = useCallback(
(name, value) => {
const params = new URLSearchParams(searchParams)
params.set(name, value)
return params.toString()
},
[searchParams]
)
return (
<>
<p>Sort By</p>
{/* useRouterを使用して */}
<button
onClick={() => {
// <pathname>?sort=asc
router.push(pathname + '?' + createQueryString('sort', 'asc'))
}}
>
ASC
</button>
{/* <Link>を使用して */}
<Link
href={
// <pathname>?sort=desc
pathname + '?' + createQueryString('sort', 'desc')
}
>
DESC
</Link>
</>
)
}
バージョン履歴
バージョン | 変更内容 |
---|---|
v13.0.0 | useSearchParams が導入されました |