コンテンツをスキップ

useSearchParams

`useSearchParams`は、現在のURLの**クエリ文字列**を読み取ることを可能にする**クライアントコンポーネント**フックです。

`useSearchParams`は、URLSearchParamsインターフェースの**読み取り専用**バージョンを返します。

app/dashboard/search-bar.tsx
'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の一部として送信できます。

例:

app/dashboard/search-bar.tsx
'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}</>
}
app/dashboard/page.tsx
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はクライアントコンポーネントの初期サーバーレンダリング中にサーバー上で利用可能になります。

例:

app/dashboard/search-bar.tsx
'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}</>
}
app/dashboard/page.tsx
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プロップを受け取ります。

app/example-client-component.tsx
'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`を導入。