RRDV6中如何传递参数?用navigate替换router.replace是否可行?
在React Router Dom v6中传递参数并替换旧路由代码
首先直接说结论:你给出的代码部分场景可行,但要区分你原来的params是「路由路径参数」还是「隐式传递的参数」,具体如下:
1. 先分析你写的代码
- query参数处理是对的:用
createSearchParams(query).toString()生成search属性,能正确把query对象转成URL查询字符串(比如{name: 'foo'}转成?name=foo),这部分完全对应旧代码里的query参数。 - params参数的处理要看场景:你把
params放到了state里,这只适用于「不需要显示在URL里的隐式参数」;如果原来的params是路由定义里的路径参数(比如/user/:id中的id),这种写法就不对。
2. 分场景给出正确写法
场景一:原来的params是路由路径参数
如果你的路由定义是类似/detail/:id这种带路径参数的格式,需要把参数直接拼到pathname中,而不是放到state里:
import { createSearchParams } from 'react-router-dom'; router.navigate( { // 把路径参数直接嵌入pathname,比如params.id对应路由里的:id pathname: `/detail/${params.id}`, search: createSearchParams(query).toString(), }, { replace: true, // 对应旧代码的replace方法,替换当前历史记录 } );
目标页面可以通过useParams()获取路径参数:
import { useParams } from 'react-router-dom'; const { id } = useParams();
场景二:原来的params是隐式传递的参数
如果params是不需要显示在URL里的临时参数,你给出的代码是可行的:
import { createSearchParams } from 'react-router-dom'; router.navigate( { pathname: path, search: createSearchParams(query).toString(), }, { replace: true, state: params // 隐式传递参数,不会出现在URL中 } );
目标页面通过useLocation()获取state参数:
import { useLocation } from 'react-router-dom'; const { state } = useLocation(); const params = state;
⚠️ 注意:state里的参数只存在于浏览器内存的历史堆栈中,页面刷新后会丢失。
3. 关键区别提醒
RRDV6里不再有旧版的params配置项:
- 路由路径参数:必须嵌入
pathname,用useParams()获取 - URL查询参数:用
createSearchParams生成search,用useSearchParams()获取 - 隐式参数:放到
state里,用useLocation().state获取
内容的提问来源于stack exchange,提问作者vaishnavi
相关产品推荐
相关产品推荐

