人生几何?

[vue-router4快速入门] 2.传递参数的两种方式

2021-09-22  本文已影响0人  林哥学前端

在实际开发中跳转页面时,我们经常要把上一页的数据传递到下一个页面,比如我们有一个用户列表,在列表页点击了一个用户,进到用户详情页,那么用户详情页就需要知道用户在列表页点击的是哪个用户,然后再展示相应的详情。这时候就需要我们用路由把用户的id传到详情页,在vue-router有两种方式可以传递参数

1)动态路由

动态路由的形式是这样的

/userDetail/:id

我们发现路由里有一个冒号,这就表示它是一个动态路由,我们还是来写一个例子,

1)在views下创建一个新的页面,userDetail.vue
<template>
  <div>用户详情页获取到了id:{{ id }}</div>
</template>

<script>
export default {
  data() {
    return {
      id: '',
    }
  },
  mounted() {},
}
</script>

<style></style>

我们把页面上基本内容写上,现在id是空,因为我们还没有获取

2)在router.js中导入新的页面,并且为它对应上路由
import { createRouter, createWebHistory } from 'vue-router' 
import index from './views/index' 
import list from './views/list' 
import userDetail from './views/userDetail'  // 新增的页面

const routes = [
  {
    path: '/', 
    component: index,
  },
  {
    path: '/list',
    component: list,
  },
  {
    path: '/userDetail/:id', // 新增的路由,前一部分/userDetial是固定路由,后面:id说明是动态路由
    component: userDetail,
  },
]

const router = createRouter({
  history: createWebHistory(),
  routes, 
})

export default router

在列表页我们写点模拟数据,渲染出来一个用户列表,在列表中我们增加router-link,实现跳转页面的效果

<template>
  <div>这里是列表页</div>
  <router-link to="/">点击跳转到首页</router-link>
  <ul>
    <li v-for="item in userList" :key="item.id">
      <router-link :to="'/userDetail/' + item.id"
        >点击查看{{ item.name }}</router-link
      >
    </li>
  </ul>
</template>

<script>
export default {
  data() {
    return {
      userList: [
        {
          name: '亚历山大',
          id: '01',
        },
        {
          name: '凯撒',
          id: '02',
        },
        {
          name: '屋大维',
          id: '03',
        },
      ],
    }
  },
}
</script>

<style></style>

我们可以发现这次我们的router-link里面to属性是有冒号的,说明它现在动态绑定的,前一部分是固定的字符串'/userDetail/',后面加上了当前一项的id,渲染结果是这样的



点击链接我们就可以进入到用户详情页了

这时候我们需要在用户详情页获取传过来的参数了

this.$route.params.id

这样就可以获取到了
需要注意两点
1)这次用的是this.$route,表示当前的路由,跟之前用的this.$router不一样,后者表示我们在router中创建的那个全局管理路由的对象
2)this.$route.params是一个对象,通过动态路由传过来的参数都会放在这个对象里,我们取的是id这个参数,这里的id和路由配置时候'/userDetail/:id'这个id是相对应的
我们在详情页也定义了一个id数据,以便我们使用,放在模板里

<template>
  <div>用户详情页获取到了id:{{ id }}</div>
</template>

<script>
export default {
  data() {
    return {
      id: '',
    }
  },
  mounted() {
    this.id = this.$route.params.id
  },
}
</script>

<style></style>

我们可以看到详情页就可以显示id了


这是通过动态路由传参,初学者可能理解起来比较费劲,要自己动手写一写,下面说一种简单的

2.使用queryString传参

例如

http://www.test.com/?a=1&b=2

在url中问号后面的a=1&b=2,就是queryString,这里表示参数a的值是1,参数b的值是2

放在我们的例子中,我们现在把用户的名字也传到用户详情页,使用queryString的方式来传
像这样

http://localhost:8080/userDetail/03?name=屋大维

改动一下我们渲染列表的代码,

    <li v-for="item in userList" :key="item.id">
      <router-link :to="'/userDetail/' + item.id + '?name=' + item.name"  // 拼接链接的时候增加了name
        >点击查看{{ item.name }}</router-link
      >
    </li>

渲染结果是:



下一步就是获取这个参数了,这么传参有个好处,就是不用更改router.js里面的配置
那么该在用户详情页直接获取了

this.$route.query.name

这次试用query对象,和上次params不一样,
我们的参数名字是name



完整代码是

<template>
  <div>用户详情页获取到了id:{{ id }},他的名字是:{{ name }}</div>
</template>

<script>
export default {
  data() {
    return {
      id: '',
      name: '',
    }
  },
  mounted() {
    this.id = this.$route.params.id
    this.name = this.$route.query.name
  },
}
</script>

<style></style>

这节课我们向页面传递参数的两种方式都学到了,在实际开发中都很常用,大家一定要掌握。

上一篇下一篇

猜你喜欢

热点阅读