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 查詢字串的工具方法。
-
URLSearchParams.get()
:回傳與搜尋參數關聯的第一個值。例如:網址 searchParams.get("a")
/dashboard?a=1
'1'
/dashboard?a=
''
/dashboard?b=3
null(空值)
/dashboard?a=1&a=2
'1'
- 使用getAll()
來取得所有值 -
URLSearchParams.has()
:回傳一個布林值,指示指定的參數是否存在。例如:網址 searchParams.has("a")
/dashboard?a=1
true(真)
/dashboard?b=3
false(假)
-
瞭解更多關於
URLSearchParams
的其他唯讀方法,包含getAll()
、keys()
、values()
、entries()
、forEach()
以及toString()
。
注意事項:
useSearchParams
是一個Client Component(客戶端元件)的 hook,並且在 Server Components(伺服器端元件) 中不受支援,以防止在 部分渲染 期間出現過時的值。- 如果應用程式包含
/pages
目錄,useSearchParams
將會回傳ReadonlyURLSearchParams | 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
可用於強制執行動態渲染。
伺服器元件
這有幫助嗎?