我有一个定制的钩子,它将状态存储在URL查询字符串中,构建在Reaction-RouteruseSearchParams
钩子的顶部:
import { useSearchParams } from 'react-router-dom';
const decodeSearchParam = (searchParam: string) => {
try {
return JSON.parse(searchParam);
} catch {
return searchParam;
}
};
function useSearchParamsState<T = string>(
searchParamName: string,
defaultValue: T,
): readonly [
searchParamsState: T,
setSearchParamsState: (newState: T) => void,
] {
const [searchParams, setSearchParams] = useSearchParams();
const acquiredSearchParam = searchParams.get(searchParamName);
const searchParamsState = acquiredSearchParam
? decodeSearchParam(acquiredSearchParam)
: defaultValue;
const setSearchParamsState = (newState: T) => {
const next = {
...Array.from(searchParams.entries()).reduce(
(o, [key, value]) => ({ ...o, [key]: value }),
{},
),
[searchParamName]: JSON.stringify(newState),
};
setSearchParams(next);
};
return [searchParamsState, setSearchParamsState];
}
export default useSearchParamsState;
我面临着一个无法解决的问题,当我同时设置两个参数时,只有最新的参数被考虑在内.
在这场堆叠闪电战中,我有一个问题的复制品:https://stackblitz.com/edit/react-lezj6t?file=src%2FsearchParams.hooks.ts
在这个例子中,如果你点击"set param1",它会将searchParams
设置为?param1=1
,但如果你点击"set param2 and param3",它只会设置最新的param3
,而不是param2
,所以searchParams
看起来是这样的:?param1=1¶m3=3