目录
一、普通静态路径 /orderDetail
二、动态路由 /orderDetail/:id
三、表格版总结对比
1、普通静态路径 /orderDetail
2、动态路由 /orderDetail/:id
2、query传参----传递对象
一、普通静态路径/orderDetail
1、使用 name + params
router.push({ name: 'OrderDetail', params: { id: 123 } }) const id = route.params.id // 123| URL显示 | /orderDetail(参数不在URL中) |
| 刷新页面 | ❌参数会丢失(变成空对象{}) |
| 页面刷新后 | route.params变为{},拿不到之前传的参数 |
| 适用场景 | 临时数据传递,不需要刷新保持(如弹窗传递、列表页到详情页但详情页不依赖刷新) |
2、使用 name + query
router.push({ name: 'OrderDetail', query: { id: 123 }) const id = route.query.id // '123'(字符串)| URL显示 | /orderDetail?id=123&type=online |
| 刷新页面 | ✅参数不会丢失 |
| 页面刷新后 | route.query仍然保持原值 |
| 参数类型 | 全部转为字符串 |
| 适用场景 | 需要刷新保持参数、可分享链接、SEO友好 |
注意:如果query传递是是一个对象
query: { editData: row }强制刷新后打印参数
这就是对象被强制转化为字符串的结果。
原因是vue路由传值会把参数都转换程字符串进行拼接,相当于string
解决方案:传递参数时将参数转化为JSON字符串
editData: JSON.stringify(row)接收时再转换为对象: console.log(JSON.parse(val));
此时,直接刷新浏览器,url参数不丢失,但是路径会把对象数据全部展示,暴露了参数
3、使用 path + query
router.push({ path: '/orderDetail', query: { id: 123, type: 'online' } }) const id = route.query.id // '123' const type = route.query.type // 'online'| URL显示 | /orderDetail?id=123&type=online |
| 刷新页面 | ✅参数不会丢失 |
与name+query区别 | 效果完全相同,只是跳转方式不同 |
| 适用场景 | 同name+query |
二、动态路由/orderDetail/:id
1、使用 name + params (标准用法)
// 路由配置 { name: 'OrderDetail', path: '/orderDetail/:id', component: OrderDetail } router.push({ name: 'OrderDetail', params: { id: 123, type: 'online' } }) const id = route.params.id // 123 const type = route.params.type // 'online'| URL显示 | /orderDetail/123(只有:id定义的参数进入URL,额外的type不在URL中) |
| 刷新页面 | ✅id不会丢失(在URL中)❌ type会丢失(不在URL中) |
| 页面刷新后 | route.params.id仍然存在route.params.type变成undefined |
| 适用场景 | 核心参数(如ID)需要刷新保持,辅助参数(如来源标记)不需要 |
2、使用 name + params + query (混合)
router.push({ name: 'OrderDetail', params: { id: 123 }, query: { type: 'online', from: 'list' } }) const id = route.params.id // 123 const type = route.query.type // 'online' const from = route.query.from // 'list'| URL显示 | /orderDetail/123?type=online&from=list |
| 刷新页面 | ✅所有参数都不会丢失 |
| 参数分布 | params中的ID在路径中,query参数在查询字符串中 |
| 适用场景 | 既有核心标识ID(需要在路径中),又有筛选/状态参数 |
3、使用 path + query
router.push({ path: '/orderDetail/123', query: { type: 'online' } }) const id = route.params.id // 123(从URL路径中解析) const type = route.query.type // 'online'| URL显示 | /orderDetail/123?type=online |
| 刷新页面 | ✅参数不会丢失 |
| 与 name+params+query区别 | 效果相同,但URL需要手动拼接动态部分 |
| 适用场景 | 可以用,但不如name方式灵活(改路由路径需要多处修改) |
三、表格版总结对比
1、普通静态路径/orderDetail
| 跳转方式 | URL显示 | 刷新后参数 | 是否可用 |
|---|---|---|---|
name+params | /orderDetail | ❌ 丢失 | ✅ 可用 |
name+query | /orderDetail?id=123 | ✅ 保留 | ✅ 可用 |
path+query | /orderDetail?id=123 | ✅ 保留 | ✅ 可用 |
path+params | - | - | ❌ 报错 |
2、动态路由/orderDetail/:id
| 跳转方式 | URL显示 | 刷新后参数 | 是否可用 |
|---|---|---|---|
name+params(只有id) | /orderDetail/123 | ✅ id保留 | ✅ 推荐 |
name+params(带额外参数) | /orderDetail/123 | ❌ 额外参数丢失 | ⚠️ 不推荐 |
name+params+query | /orderDetail/123?type=online | ✅ 全部保留 | ✅ 推荐 |
path+params(带id) | /orderDetail/123 | ❌ 额外参数丢失 | ❌ 不推荐 |
path+query | /orderDetail/123?type=online | ✅ 全部保留 | ⚠️ 可用但不推荐 |