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(): 検索パラメータに関連付けられた最初の値を返します。例:

    URLsearchParams.get("a")
    /dashboard?a=1'1'
    /dashboard?a=''
    /dashboard?b=3null
    /dashboard?a=1&a=2'1' - すべての値を取得するには getAll() を使用
  • URLSearchParams.has(): 指定されたパラメータが存在するかどうかを示すブール値を返します。例:

    URLsearchParams.has("a")
    /dashboard?a=1true
    /dashboard?b=3false
  • URLSearchParams の他の読み取り専用メソッドについて詳しく学びましょう。これには getAll()keys()values()entries()forEach()toString() が含まれます。

知っておくと良いこと:

  • useSearchParamsクライアントコンポーネント 用のフックであり、部分レンダリング 中に古い値が表示されるのを防ぐため、サーバーコンポーネント ではサポートされていません
  • アプリケーションに /pages ディレクトリが含まれている場合、useSearchParamsReadonlyURLSearchParams | 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')

  // 静的レンダリングを使用している場合、サーバーではログに記録されません
  console.log(search)

  return <>Search: {search}</>
}

動的レンダリング

ルートが動的レンダリングされている場合、useSearchParams はクライアントコンポーネントの初期サーバーレンダリング中にサーバーで利用可能になります。

例:

'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}</>
}

知っておくと良いこと: 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()

  // 現在の 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>
    </>
  )
}

バージョン履歴

バージョン変更点
v13.0.0useSearchParams が導入されました。

On this page