跳至內容

useSearchParams

useSearchParams 是一個客戶端組件 hook,可讓您讀取目前網址的查詢字串

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 會回傳一個唯讀版本的 URLSearchParams 介面,其中包含用於讀取 URL 查詢字串的工具方法。

注意事項:

行為

靜態渲染

如果路由是靜態渲染的,呼叫 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 stale。檢視詳細說明

反之,請在 Client Component 中使用 Page 的 searchParams 屬性或 useSearchParams hook,它會在 client 端使用最新的 searchParams 重新渲染。

範例

更新 searchParams

您可以使用 useRouterLink 來設定新的 searchParams。在執行導覽後,目前的 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