在Vue Router中,路由路径有以下几种匹配形式:

  • 静态匹配:即完全按照path中的内容,进行相等匹配。
  • 动态匹配:根据path中定义的路径匹配规则匹配多个路径。

路径参数

Vue中的动态参数匹配使用的是路径参数匹配。路径参数是路径中的一个动态字段。路径参数的值会动态变化,根据这些路径参数的值,可以读取相应的数据或展示相应的页面。

例如,有个User组件对所有用户进行渲染,但用户ID不同。使用路径参数,可以让用户ID像路径中的某个资源或目录一样在URL中展示。变换不同的用户ID,就像切换目录一样路由到不同的用户界面。

使用路径参数包含3个步骤:

  • 在Router配置文件(router/index.js)中,配置路径参数的匹配规则。
  • 使用<router-link>传递路径参数。
  • 在对应的路由组件中使用$route.params接收路径参数。

配置路径参数匹配规则

在Router配置文件的route元素或children中的path属性上配置当前路由的路径参数匹配规则。

例如,在User路由组件中使用路径参数,其路由配置如下:

 1/* ... */
 2import User from '../pages/User.vue'
 3
 4export default new VueRouter({
 5  routes: [
 6    {
 7      path: '/user/:id',
 8      component: User,
 9    },
10  ],
11})

如上User的路由规则可以使用/user/zhangsan/user/lisi等方式映射。

嵌套路由 —— 路由 Query 传参中的MessageDetail改为使用路径参数形式传参,其路由配置如下:

 1/* ... */
 2
 3export default new VueRouter({
 4  routes: [
 5    /* about route... */
 6    {
 7      path: '/home',
 8      component: Home,
 9      children: [
10        /* news route... */
11        {
12          path: 'message',
13          component: Message,
14          children: [
15            {
16              path: ':id/:title', // 路径传参
17              component: MessageDetail,
18            }
19          ],
20        },
21      ]
22    },
23  ],
24})

MessageDetailpath中,使用了两个以:为开头的占位符(:id:title)。:后是当前路径参数的名称(idtitle)。


传递路径参数

传递路径参数的方式与传递Query参数的方式十分相同。传递路径参数也有两种方式:

  • 字符拼接:

    1<router-link :to="`/home/message/${message.id}/${message.title}`">
    
  • 传入对象:与传递Query参数的方式基本相同。不同的是,传递路径参数需要配置的是to prop对象中params属性。并且传递路径参数时不能使用path属性指定路由,必须使用name来指定路由。

    1<router-link :to="{
    2  name: 'MessageDetail',
    3  params: {
    4    id: message.id,
    5    title: message.title,
    6  },
    7}">
    8  {{ message.title }}
    9</router-link>
    

    params中配置传递的参数以及它们的值。params属性的key是传递的参数的名称(对应路由配置中占位符里:后的内容),value是传递的参数的值(就像Axios的params配置那样)。

接收路径参数

接收路径参数的形式与接收Query参数的形式也十分相似。在对应的路由组件实例中,使用$route.params来接收并获取这些路径参数。

接上例,在MessageDetail中接收并获取路径参数:

1computed: {
2  id() {
3    return this.$route.params.id
4  },
5  title() {
6    return this.$route.params.title
7  }
8}

在路由实例中,通过$route.params.argName的形式获取路径参数的值。

注:

获取路径参数的形式很固定,为了使代码更加简介、书写更加简便,可以如上使用computed属性来接收它们的值。当然还有其它更简便的方法。

路径参数需要在路由的path中使用占位符配置,否则Vue Router不会接收到这些路径参数。