cas*_*hol 40 javascript reactjs react-router react-router-dom
我正在使用反应路由器 v6。我想导航到具有 searchParams 的 URL,但我没有找到开箱即用的方法。useNavigate
允许我通过传入字符串来导航到 URL。useSearchParams
允许我在当前页面上设置 searchParams。
我可以使用生成 searchParams createSearchParams
,然后将其转换为字符串,并将其附加到 URL 的末尾,?
中间有一个,但这看起来像是一个 hack。
我希望能够做类似的事情:
const navigate = useNavigate();
// listing?foo=bar
navigate("listing", {
params: {
foo: "bar"
}
});
Run Code Online (Sandbox Code Playgroud)
我的黑客解决方法:
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"
});
Run Code Online (Sandbox Code Playgroud)
我错过了文档中的某些内容吗?
cas*_*hol 56
更新
不再需要?
在搜索前添加(截至 2021 年 9 月):
import { createSearchParams, useNavigate } from "react-router-dom";
...
const navigate = useNavigate();
navigate({
pathname: "listing",
search: createSearchParams({
foo: "bar"
}).toString()
});
Run Code Online (Sandbox Code Playgroud)
这并不像我想要的那么简化,但我认为这是我们目前可以得到的最接近的结果。navigate
确实支持传入搜索查询字符串(而不是对象)。
import { createSearchParams, useNavigate } from "react-router-dom";
...
const navigate = useNavigate();
navigate({
pathname: "listing",
search: `?${createSearchParams({
foo: "bar"
})}`
});
Run Code Online (Sandbox Code Playgroud)
来源: https: //github.com/ReactTraining/react-router/issues/7743#issuecomment-770296462
Dre*_*ese 14
你所拥有的对我来说看起来不错。使用generatePath和createSearchParams实用程序可能会更干净一些,但它仍然是相同的基本思想。
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);
};
};
Run Code Online (Sandbox Code Playgroud)
如果您考虑一下,这并不是什么黑客行为,URL 需要在某个地方定义,无论是路径参数还是查询字符串的一部分,您仍然需要提供该详细信息并构建要导航到的路径字符串。
RRDv6.4 更新
import { createSearchParams, useNavigate } from "react-router-dom";
...
const useNavigateParams = () => {
const navigate = useNavigate();
return (pathname, params) => {
const path = {
pathname,
search: createSearchParams(params).toString()
};
navigate(path);
};
};
Run Code Online (Sandbox Code Playgroud)
Fir*_*uid 12
为了优雅地做到这一点,您应该使用useSearchParams
hook 而不是useNavigate
.
正如文档中所指定的:
setSearchParams 函数的工作方式类似于导航,但仅适用于 URL 的搜索部分。另请注意,setSearchParams 的第二个参数与要导航的第二个参数的类型相同。
import { useSearchParams } from "react-router-dom";
...
const [searchParams, setSearchParams] = useSearchParams()
...
const handleClick = () => {
searchParams.set('foo', 'bar');
setSearchParams(searchParams)
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
99643 次 |
最近记录: |