vue-路由传参,梳理各种传参情况

文章讲述了在使用Vue路由器时,通过query参数传递对象时遇到的问题。当刷新页面时,由于Vue将参数转为字符串,导致对象信息丢失。解决办法是将对象转换为JSON字符串进行传递,在接收端再解析回对象。这种方法虽然能防止数据丢失,但会将对象数据暴露在URL中。

目录

一、普通静态路径  /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✅ 全部保留⚠️ 可用但不推荐

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值