useUrlState 是我封装的 hooks ,返回 state 和 stateSetter
另外如果在多个组件中使用同一个 key( useUrlState 的第一个参数),那么组件之间就可以共享 setter 和 state
以下是 API 调用的形式:
const [searchWord, searchWordSet] = useUrlState("searchWord", "");
const [filterStatus, filterStatusSet] = useUrlState("filterStatus", "");
<input value={searchWord} onChange={e=>searchWordSet(e.target.value)}/>
在 react-router v6 基础山,封装了一下 useSearchParams :
import { useCallback, useEffect } from "react";
import { useSearchParams, NavigateOptions } from "react-router-dom";
export const navigateOptions: NavigateOptions = {
replace: true,
};
const useUrlState = (key: string, state: string) => {
const [searchParams, setSearchParams] = useSearchParams();
useEffect(() => {
const hasStateInUrl = searchParams.has(key);
const urlState = searchParams.get(key) || "";
if (!hasStateInUrl && urlState !== state) {
searchParams.set(key, state);
setSearchParams(searchParams, navigateOptions);
}
}, [searchParams, state, key]);
const setter = useCallback(
(newState: string) => {
searchParams.set(key, newState);
setSearchParams(searchParams, navigateOptions);
},
[key, searchParams]
);
return [searchParams.get(key) || state, setter] as const;
};
export default useUrlState;
正常情况下使用表现良好,但是如果出现连续的 setter ,例如
const [pageSize,pageSizeSet]=useUrlstate("pageSize","10");
const [pageIndex,pageIndexSet]=useUrlstate("pageIndex","1");
//下面是连续调用 setter
onPagingChange({ pageIndex, pageSize }) {
pageSizeSet(pageSize);
pageIndexSet(pageIndex)
}
连续的 setter 的第一个不会生效,例如👆的代码 pageSizeSet 就不会生效。
原因是因为两个 setter 执行起点是一样的,最后只有后面那个覆盖前面的
我尝试 setSearchParams 接受变更函数来更改 url ,结果依旧会产生覆盖的 bug 。
求解决思路
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.