为了在 Next.js 中操作 URL 中的查询参数,我使用了一个使用 useRouter 提供的自定义钩子,但我还添加了一些 util 方法,在这种情况下,为 URL 添加过滤器我有方法 添加过滤器。
这是自定义钩子的主体。
const useRouterFilter = () =>{
const { pathname, query, push } = useRouter()
return {
addFilter,
...
}
}
这将是钩子内的 addFilter 方法:
/**
* Adds a query param to the URL string to use it as a filter.
* @param field The name of the field to filter by.
* @param value The value of the field to filter by.
*/
const addFilter = (field: string, value: string | boolean | number) => {
const { [field]: filter, ...rest } = query
if (!filter) {
push(
{
pathname,
query: { ...rest, [field]: encodeURIComponent(value) },
},
undefined,
{ shallow: true }
)
} else if (Array.isArray(filter)) {
if (filter.indexOf(encodeURIComponent(value)) > -1) return
push(
{
pathname,
query: { ...rest, [field]: [...filter, encodeURIComponent(value)] },
},
undefined,
{ shallow: true }
)
} else {
if (filter === encodeURIComponent(value)) return
push(
{
pathname,
query: { ...rest, [field]: [filter, encodeURIComponent(value)] },
},
undefined,
{ shallow: true }
)
}
}
在这种情况下,我使用push 将参数添加到URL,但也可以使用replace。