[英]react-router v6: Navigate to a URL with searchParams
我正在使用 react-router v6。 我想导航到具有 searchParams 的 URL,但我没有看到开箱即用的方法。 useNavigate
允许我通过传入字符串导航到 URL。 useSearchParams
允许我在当前页面上设置 searchParams。
我可以使用createSearchParams
生成 searchParams,然后将其转换为字符串,并将 append 转换为带有?
的 URL 的末尾。 介于两者之间,但这似乎是一个黑客。
我希望能够做类似的事情:
const navigate = useNavigate();
// listing?foo=bar
navigate("listing", {
params: {
foo: "bar"
}
});
我的 hacky 解决方法:
function useNavigateParams() {
const navigate = useNavigate();
return (url: string, params: Record<string, string | string[]>) => {
const searchParams = createSearchParams(params).toString();
navigate(url + "?" + searchParams);
};
}
const navigateParams = useNavigateParams();
navigateParams("listing", {
foo: "bar"
});
我是否遗漏了文档中的某些内容?
要优雅地执行此操作,您应该使用useSearchParams
挂钩而不是useNavigate
。
如文档中所述:
setSearchParams function 的工作方式类似于导航,但仅适用于 URL 的搜索部分。另请注意,setSearchParams 的第二个参数与要导航的第二个参数的类型相同。
import { useSearchParams } from "react-router-dom";
...
const [searchParams, setSearchParams] = useSearchParams()
...
const handleClick = () => {
searchParams.set('foo', 'bar');
setSearchParams(searchParams)
}
你所拥有的对我来说看起来不错。 使用generatePath实用程序可能会更简洁一些,但它仍然是相同的基本思想。
import { generatePath, useNavigate } from "react-router-dom";
...
const useNavigateParams = () => {
const navigate = useNavigate();
return (url: string, params: Record<string, string | string[]>) => {
const path = generatePath(":url?:queryString", {
url,
queryString: createSearchParams(params).toString()
});
navigate(path);
};
};
如果您考虑一下,这并不是什么 hack,URL 需要在某个地方定义,无论是路径参数还是查询字符串的一部分,您仍然需要提供该详细信息并构建一个路径字符串以导航到。
这并不像我想的那么简单,但我认为这是我们目前能得到的最接近的。 navigate
确实支持传入搜索查询字符串(不是对象)。
import { createSearchParams, useNavigate } from "react-router-dom";
...
const navigate = useNavigate();
navigate({
pathname: "listing",
search: `?${createSearchParams({
foo: "bar"
})}`
});
来源: https://github.com/ReactTraining/react-router/issues/7743#issuecomment-770296462
您可以轻松地使用它们:
import { useNavigate, useSearchParams } from "react-router-dom"; ... const [searchBarParams, setSearchBarParams] = useSearchParams(); const navigate = useNavigate(); ... const handleChange = (event, value) => { navigate("/") searchBarParams.set("foo",value) setSearchBarParams(searchBarParams); }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.