vue-router路由传参的几种方式-案例

绝地灬酷狼 2022-09-08 03:52 330阅读 0赞

说明

点击列表的详情,跳转到详情内页,在内页根据传递的参数获取详情数据

刷新页面参数丢失

编程式导航

方法一:通过 params 传参

路由配置如下

  1. {
  2. path: '/detail/:id', //若id后面加?代表这个参数是可选的
  3. name: 'detail',
  4. component: Detail
  5. }
  • 通过 $router.push 中 path 携带参数的方式

    // 列表中的传参
    goDetail(row) {

    1. this.$router.push({
    2. path: `/detail/${row.id}`
    3. })

    }

    // 详情页获取参数
    this.$route.params.id

  • 通过 $router.push 的 params 传参

    // 列表页传参
    goDetail(row) {

    1. this.$router.push({
    2. name: 'detail',
    3. params: {
    4. id: row.id
    5. }
    6. })

    }

    // 详情页获取
    this.$route.params.id

注:这种方式的传参,路径用 name,路径用 name,路径用 name , 用 path 会获取不到;如果在路由配置中没有添加 /:id 即 path: ‘detail’,url 中不会显示 id,在详情页还是可以拿到参数 id,但刷新后参数丢失。

以上这两种方式,传递的参数 id 会在 url 后面显示

传递的参数会暴露在网址中。

如果在路由中设置了params参数 /:id,但是在跳转的时候没有传递参数,会导致页面没有内容或跳转失败,可在后面加 ?代表这个参数是可选的,即 /:id?

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_Q1NETiBASmFja2llRFlI_size_7_color_FFFFFF_t_70_g_se_x_16

方法二:通过 query 传参

  1. // 路由配置
  2. {
  3. path: '/detail',
  4. name: 'detail',
  5. component: Detail
  6. }
  7. // 列表页
  8. goDetail(row) {
  9. this.$router.push({
  10. path: '/detail',
  11. query: {
  12. id: row.id
  13. }
  14. })
  15. }
  16. // 详情页
  17. this.$route.query.id

注:这种方式传递的参数会在地址栏的 url 后面显示 ?id=?,类似于 get 传参;query 必须配合 path 来传参

传递的参数是对象或数组

还有一种情况就是,如果通过 query 的方式传递对象或数组,在地址栏中会被强制转换成 [object Object],刷新后也获取不到对象值。

此时可以通过 JSON.stringify() 方法将要传递的参数转换为字符串传递,在详情页再通过 JSON.parse() 转换成对象。

  1. let parObj = JSON.stringify(obj)
  2. this.$router.push({
  3. path: '/detail',
  4. query: {
  5. 'obj': parObj
  6. }
  7. })
  8. // 详情页
  9. JSON.parse(this.$route.query.obj)

这个方法虽然可以传递对象,若数据少还好,数据多的话地址栏就很长了

注意:在所有的子组件中获取路由参数是 $route 不是 $router

以上 params 和 query 传参方式对比:

  • 通过 $router.push 的 params + name 传参,若路由中没有设置params参数,参数不会拼接在路由后面,但是页面刷新参数会丢失。
  • 通过 $router.push 中 path 携带参数或通过 query 传参,参数会拼接在地址后面,会暴露信息。

方法三:使用 props 配合组件路由解耦

  1. // 路由配置
  2. {
  3. path: '/detail/:id',
  4. name: 'detail',
  5. component: Detail,
  6. props: true // 如果props设置为true,$route.params将被设置为组件属性
  7. }
  8. // 列表页
  9. goDetail(row) {
  10. this.$router.push({
  11. path: '/detail',
  12. query: {
  13. id: row.id
  14. }
  15. })
  16. }
  17. // 详情页
  18. export default {
  19. props: {
  20. // 将路由中传递的参数id解耦到组件的props属性上
  21. id: String
  22. },
  23. mounted: {
  24. console.log(this.id)
  25. }
  26. }

详见官方文档:动态路由匹配 路由组件传参

此外,还可以通过把参数存在 sessionStorage 或 localStorage 中来解决页面刷新参数丢失的问题,具体结合实际项目即可

发表评论

表情:
评论列表 (有 0 条评论,330人围观)

还没有评论,来说两句吧...

相关阅读

    相关 VueRouter

    1. 前言 本小节我们介绍 VueRouter 路由组件传参。包括 params 传参、query 传参的两种方式。路由传参的知识点非常重要,在日常开发中,我们经常会通过

    相关 Vue方式

    前言:顾名思义,vue路由传参是指嵌套路由时父路由向子路由传递参数,否则操作无效。传参方式可以划分为params传参和query传参,params传参又可以分为url中显示参数