Vue Router 中如何获取路由传递过来的参数?

在 Vue Router 中,获取路由传递的参数主要有以下几种方式:

一、通过 $route 对象获取

在 Vue 组件中,可以直接通过 $route 对象访问路由参数:

1、对于动态路由参数(路径参数):

<template>

<div>用户ID: {{ $route.params.id }} </div>

</template>

2、对于查询参数:

<template>

<div>搜索关键词: {{ $route.query.keyword }} </div>

</template>

3、对于 hash 值:

<template>

<div>Hash: {{ $route.hash }} </div>

</template>

二、使用Composition APl的 useRoute 钩子

在 Vue 3 的组合式 AP| 中,可以使用 useRoute 钩子获取路由参数:

<script setup>

import { useRoute } from 'vue-router'

const route= useRoute();

console.log(route.params.id)//获取路径参数

console.log(route.query.keyword)//获取查询参数

console.1og(route.hash)//获取 hash 值

</script>

三、通过 props 解耦方式获取

为了解耦组件和路由,可以通过配置路由的 props 选项,将路由参数作为组件的 props 传入:

// 路由配置

const routes = [

{

path: '/user/:id',

component: User,

props: true // 将路由参数作为组件 props 传入

}

]

然后在组件中通过 props 接收:

<script setup>

// Composition API

defineProps({

id: string

})

</script>

<template>

<div>用户ID: {{ id }}</div>

</template>

或者在选项式 API中

<script>

export default{

props:{

id: string

}

}

</script>

扩展知识

1)、路由参数的类型

Vue Router 中的路由参数主要有三种类型:

  1. 路径参数(Params):通过路径定义的动态部分,如 /users/:id
  2. 查询参数(Query):URL中?后面的参数,如 /users?role=admin
  3. Hash 值:URL中#后面的部分,如 /users#profile

2)、路由参数的高级配置

路径参数的高级匹配模式

Vue Router 支持在路径参数中使用正则表达式进行更精确的匹配,

// 只匹配数字 ID

{ path: "/users/:id(\\d+)',component: User }

// 匹配可选参数

{ path: '/users/:username?', component: User }

// 匹配多个参数段

{ path: '/:pathMatch(.*)*', component: NotFound }

函数式 props 传递

可以使用函数来处理和转换路由参数:

const routes = [

{

path: '/search',

component: SearchUser,

props: route => ({

query: route.query.q,

page: Number(route.query.page) || 1 // 转换为数字类型

})

}

]

3)、响应路由参数变化

当在同一个组件中路由参数发生变化时(如从 /users/1 导航到 /users/2 ),组件实例会被复用,不会触发生命周期钩子。此时需要监听路由参数的变化:

使用 watch 监听

<script setup>

import { watch } from 'vue'

import { useRoute } from 'vue-router'

const route = useRoute()

watch(() => route.params.id,(newId,oldId) => {

// 路由参数变化时执行的逻辑

console.log(`路由从 ${oldId} 变为 ${newId}`)

// 重新获取数据等操作

})

</script>

使用导航守卫

<script setup>

import { onBeforeRouteUpdate } from 'vue-router'

onBeforeRouteUpdate(async (to,from) => {

// 可以在这里执行异步操作

const userData = await fetchUser(to.params.id)

// 还可以取消导航

})

</script>

4)、实际应用场景

用户详情页: 通过 ID 获取不同用户信息

/users/:id // 获取 route.params.id

产品筛选页: 通过查询参数筛选产品

/products?category=electronics&sort=price // 获取 route.query.category 和 route.query.sort

多级路由参数:嵌套的动态路由


/users/:userId/posts/:postId //
获取 route.params.userId 和 route.params.postId

Vue Router 的官方文档提供了更多详细信息,可以访问以下链接了解更多:

动态路由匹配:
https://router.vuejs.org/zh/guide/essentials/dynamic-matching.html

路由组件传参:
https://router.vuejs.org/zh/guide/essentials/passing-props.html