vue3路由跳转传参方式

vue3路由跳转传参方式

1.文章写作背景

写这篇文章的起因,是因为一个bug。
我在vue3中使用router的push方法跳转页面,并在params中传入参数后,
发现在跳转后的页面无法获取到params的参数。

2.bug原因分析

// bug代码
import {useRouter} from "vue-router";

const router = useRouter();
 router.push({
    name:'linked1',
    params:{
      id:'666',
      age:23
    }
  })

在跳转后的页面F12,打开浏览器控制台后,发现vue-router有个warning。Discarded invalid param(s) “id”, “age” when navigating。翻译过来就是导航时丢弃了无效参数“id”、“age”
bug控制台报错信息
这下为什么在页面跳转后,获取不到params传递参数的原因就很清晰了,原来是直接被vue-router给丢弃了

不过这又引出了一个新问题。那就是vue-router为啥要把我好端端传递的参数给丢掉嘞?咱们这次看图说话。

请看图片:
在这里插入图片描述
上面是vue-router4的一次更新日志,讲的很清楚。咱们直接抓重点params传递的参数,在页面刷新后会丢失参数

因为vue2项目一般是使用vue-router3的,所以页面跳转时用params传递参数,是支持的。
所以相信写过vue2的小伙伴们,如果有过页面跳转用params传参经历的都能理解这句话背后的血和泪。
真是个巨坑,而且这么设置贼反人类,我都跳转页面了,而且参数都传过去了。你告诉我,不能让用户刷新页面,否则会丢失,那我为啥不用状态管理工具,或者直接持久化到浏览器缓存里呢?所以说对于vue-router4的这次更新,我是举双手赞成的。

3.问题解决

想要解决这个params传参丢失这个bug,有如下几种方法

1.使用query传参(推荐,暴露传参)
先简述一下query和params传参的区别吧。
params
params是隐蔽的传参,参数在内存中,不暴露到浏览器路径中。
query
query是暴露的传参,将参数以?的形式,拼接到跳转后的路径上。

// 跳转页面
import {useRouter} from "vue-router";

const router = useRouter();
 router.push({
    name:'linked1',
    query:{
      id:'666',
      age:23
    }
  })
// 接收页面
import {useRoute} from "vue-router";

const route = useRoute();
const query = route.query;

跳转后页面及参数
在这里插入图片描述
2.params+动态路由匹配(推荐,暴露传参)
如果你在跳转页面时,所要传递的参数较少,则可直接在路由中声明要传递的参数,然后在配合params使用。

这时你就会惊奇的发现,控制台中那个warning神奇的消失了,而且参数也拼到路径上传递过去了。

注意:由于此时参数名称与个数在路由中已经声明过了,所以在配合使用params传参时。一定不能传错名字,或者多传和少传参数。因为少传和传错名称,浏览器控制台会报少必填参数的错误,跳转不过去。而多传则会被舍弃,传递不到跳转后的页面上。
动态路由设置:
在这里插入图片描述

// 跳转页面
import {useRouter} from "vue-router";

const router = useRouter();
 router.push({
    name:'linked2',
    params:{
      id:'666',
      age:23
    }
  })
// 接收页面
import {useRoute} from "vue-router";

const route = useRoute();
const query = route.params;

3.使用historyAPI,传递时用state(不推荐,隐蔽传参)
注意:state内要跟传递的对象。此时接收不需要route,直接使用history.state即可

//  跳转页面
import {useRouter} from "vue-router";

const router = useRouter();
  router.push({
    name: 'linked1',
    state: {
      params: {
        id: '666',
        age:
            23
      }
    }
  })
//  接收页面
const historyParams = history.state.params

3.结语

我先简述一下我为啥推荐暴露传参而不推荐隐蔽传参。
首先,虽然history API能解决刷新页面丢失数据的情况,但仅限于当前tab页,因为参数是保存到当前tab页的history中。所以会有一个神奇的现象,那就是你复制了当前的url,想打开一个新tab页,然后发现没有参数了。
其次,也算是我的一个疑问,希望能蹲到一个大佬为我指点一下迷津。
我一直不理解前端跳转页面,为啥传个参数还要遮遮掩掩的,感觉也就传个id啥的就够了,其他信息直接到新页面拉接口获取不就行了,也不涉及什么敏感信息的。

而且隐蔽传参最大的一个bug就是,打开同一个url,如果你不是从前置页面跳转过来的,那么就获取不到参数,页面渲染页不一致,感觉这是个巨坑。所以我就很不理解,也更不推荐隐蔽传参。
不过也大概率是我才疏学浅。希望能有个大佬为我讲解一下,有啥必须在跳转页面时,使用隐蔽传参的场景,我好学习一下,以解心中迷惑,希望大家不吝赐教,多多在评论区讨论,感谢了~~

  • 25
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Vue3中,可以使用三种方式进行路由跳转传参:通过params、query和动态路由。 1. 通过params进行传参: 在跳转前,使用`router.push`方法,并在`params`对象中指定参数名和对应的值。例如: ```javascript function acty() { router.push({ name: 'tiaozhn', params: { id: "aaa" } }) } ``` 在目标组件中,可以通过`$route.params`来获取传递的参数。例如: ```javascript console.log($route.params.id); ``` 这样就可以获取到传递的参数值。 2. 通过query进行传参: 在跳转前,使用`router.push`方法,并在`query`对象中指定参数名和对应的值。例如: ```javascript function acty() { router.push({ path: '/tiaozhn', query: { som: "Aaa" } }) } ``` 在目标组件中,可以通过`$route.query`来获取传递的参数。例如: ```javascript console.log($route.query.som); ``` 这样就可以获取到传递的参数值。 3. 使用动态路由进行传参: 在跳转前,可以通过在路径中添加参数来进行传参。例如: ```javascript function acty() { var id = 1; proxy.$router.push('/tiaozhn/' + id) } ``` 在目标组件中,可以通过`$route.params`来获取传递的参数。例如: ```javascript console.log(proxy.$route.params.id); ``` 这样就可以获取到传递的参数值。 总结:在Vue3中,可以使用params、query和动态路由这三种方式进行路由跳转传参,根据需求选择合适的方式即可。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [VUE3 跳转传参的三种方式](https://blog.csdn.net/qq_54602808/article/details/119789250)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值