React hook to extract search parameters from URL.
Add the hook via the CLI:
npx @novajslabs/cli add useSearchParams
Or copy and paste the code into your project:
import { useEffect, useState } from 'react'
/* eslint-disable-next-line */
type TUseSearchParams = <T = Record<string, any>>(
url?: string,
opt?: { unique: boolean },
) => T
export const useSearchParams: TUseSearchParams = <T>(
url = location.href,
opt = { unique: true },
) => {
const _urlSearch = new URL(url)
const [params, setParams] = useState<Record<string, string | string[]>>(() =>
Object.fromEntries(_urlSearch.searchParams.entries()),
)
useEffect(() => {
const len: number = Object.values(params).length
if (!opt || opt.unique || len === _urlSearch.searchParams?.size) return
for (const [key, value] of _urlSearch.searchParams) {
if (value === params?.[key]) continue
if (
Array.isArray(params?.[key]) &&
Array.from(params?.[key]).includes(value)
)
continue
setParams(() => ({
...params,
[key]: [...(params?.[key] ?? []), value],
}))
}
}, [])
return Object.fromEntries(
Object.entries(params).map(([key, value]) => [
key,
!Array.isArray(value)
? JSON.parse(value)
: value.map((items) => JSON.parse(items)),
]),
) as T
}
React 16.8 or higher
- Name
url
- Type
- string
- Optional
- optional
- Description
The URL to parse the search parameters from. Defaults to the current window location.
- Name
opt
- Type
- object
- Optional
- optional
- Description
Options for parsing parameters.
- Name
opt.unique
- Type
- boolean
- Optional
- optional
- Description
If true, ensures each parameter key has a unique value. Defaults to true.
- Name
params
- Type
- T
- Description
An object containing the parsed search parameters. Values are parsed as JSON, supporting both single and multiple values.
import { useSearchParams } from './hooks/useSearchParams'
const App = () => {
const searchParams = useSearchParams()
return (
<div>
<h1>Search Results</h1>
<pre>{JSON.stringify(searchParams, null, 2)}</pre>
</div>
)
}
export default App
Here are some use cases where this React hook is useful:
- Extracting filters from a URL in a product listing page
- Reading query parameters for user authentication or redirection
- Parsing search inputs for a blog or article listing
- Managing URL state for multi-step forms
- Extracting parameters for API requests in a dashboard