Skip to content

Commit

Permalink
fix(useSearchParams): stable setSearchParams
Browse files Browse the repository at this point in the history
  • Loading branch information
junwen-k committed Dec 2, 2023
1 parent 3d4b2b9 commit 1823ef6
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 16 deletions.
14 changes: 10 additions & 4 deletions packages/wouter/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -83,19 +83,25 @@ export const useSearchParams = () => {
const [, navigate] = useLocationFromRouter(router);

const search = unescape(stripQm(router.searchHook(router)));
const searchParams = useMemo(() => new URLSearchParams(search), [search]);
const searchParamsRef = useRef(new URLSearchParams(search));
searchParamsRef.current = useMemo(
() => new URLSearchParams(search),
[search]
);

const setSearchParams = useCallback(
(nextInit, navOpts) => {
const newSearchParams = new URLSearchParams(
typeof nextInit === "function" ? nextInit(searchParams) : nextInit
typeof nextInit === "function"
? nextInit(searchParamsRef.current)
: nextInit
);
navigate("?" + newSearchParams, navOpts);
},
[navigate, searchParams]
[navigate]
);

return [searchParams, setSearchParams];
return [searchParamsRef.current, setSearchParams];
};

const matchRoute = (parser, route, path, loose) => {
Expand Down
32 changes: 20 additions & 12 deletions packages/wouter/src/use-browser-location.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
import { useCallback, useMemo, useSyncExternalStore } from "./react-deps.js";
import {
useRef,
useCallback,
useMemo,
useSyncExternalStore,
} from "./react-deps.js";

/**
* History API docs @see https://developer.mozilla.org/en-US/docs/Web/API/History
Expand Down Expand Up @@ -35,19 +40,22 @@ export const useSearch = ({ ssrSearch = "" } = {}) =>

export const useSearchParams = ({ ssrSearch = "" } = {}) => {
const search = useSearch({ ssrSearch });
const searchParams = useMemo(() => new URLSearchParams(search), [search]);

const setSearchParams = useCallback(
(nextInit, navOpts) => {
const newSearchParams = new URLSearchParams(
typeof nextInit === "function" ? nextInit(searchParams) : nextInit
);
navigate("?" + newSearchParams, navOpts);
},
[searchParams]
const searchParamsRef = useRef(new URLSearchParams(search));
searchParamsRef.current = useMemo(
() => new URLSearchParams(search),
[search]
);

return [searchParams, setSearchParams];
const setSearchParams = useCallback((nextInit, navOpts) => {
const newSearchParams = new URLSearchParams(
typeof nextInit === "function"
? nextInit(searchParamsRef.current)
: nextInit
);
navigate("?" + newSearchParams, navOpts);
}, []);

return [searchParamsRef.current, setSearchParams];
};

const currentPathname = () => location.pathname;
Expand Down

0 comments on commit 1823ef6

Please sign in to comment.