跳至内容
API 参考函数useSearchParams

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 返回 URLSearchParams 接口的只读版本,其中包含用于读取 URL 查询字符串的实用程序方法

了解一下:

  • useSearchParams 是一个客户端组件钩子,并且在服务器组件不支持,以防止在部分渲染期间出现过时值。
  • 如果应用程序包含/pages目录,则useSearchParams将返回ReadonlyURLSearchParams | nullnull值用于迁移期间的兼容性,因为在不使用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

您可以使用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