在 Vue Router 中,获取路由传递的参数是开发中的常见需求。参数主要分为两种:动态路由参数(params) 和 查询参数(query)。获取方式取决于你使用的 Vue 版本和 API 风格(Options API 或 Composition API)。
一、 参数类型
- 动态路由参数 (
params):- 来源于路由路径中的动态片段。
- 例如:路由
path: '/user/:id',当访问/user/123时,params为{ id: '123' }。 - 注意:
params只能通过name或params进行导航(router.push({ name: 'user', params: { id: 123 } })),不能通过path直接设置(router.push('/user/123')会丢失params)。
- 查询参数 (
query):- 来源于 URL 中的查询字符串(
?后面的部分)。 - 例如:访问
/user?name=john&age=25时,query为{ name: 'john', age: '25' }。 - 可以通过
path或name导航时设置。
- 来源于 URL 中的查询字符串(
二、 获取参数的方法
方法一:使用 this.$route (Options API – Vue 2 & Vue 3)
在组件的 setup 外部(Options API 风格),通过 this.$route 对象访问当前路由信息。
<script>
export default {
computed: {
// 获取动态参数
userId() {
return this.$route.params.id
},
// 获取查询参数
userName() {
return this.$route.query.name
},
userAge() {
return this.$route.query.age
}
},
watch: {
// 监听动态参数变化(当在同一路由的不同动态值间切换时)
'$route.params.id'(newId, oldId) {
if (newId !== oldId) {
this.fetchUserData(newId)
}
},
// 监听查询参数变化
'$route.query.name'(newName) {
this.updateSearchResults(newName)
}
},
methods: {
fetchUserData(id) {
console.log('Fetching user:', id)
},
updateSearchResults(name) {
console.log('Searching for:', name)
}
},
created() {
// 在生命周期钩子中获取
console.log('Params:', this.$route.params)
console.log('Query:', this.$route.query)
}
}
</script>
方法二:使用 useRoute() Composable (Composition API – Vue 3 推荐)
在 setup() 函数或 <script setup> 中,使用 useRoute() 钩子获取当前路由对象。
<script setup>
import { useRoute } from 'vue-router'
import { ref, watch } from 'vue'
// 获取路由对象
const route = useRoute()
// 响应式地获取参数
const userId = ref(route.params.id)
const userName = ref(route.query.name)
const userAge = ref(route.query.age)
// 监听参数变化(使用 watch 监视 route 对象的特定属性)
watch(
() => route.params.id,
(newId, oldId) => {
if (newId !== oldId) {
fetchUserData(newId)
}
}
)
watch(
() => route.query.name,
(newName) => {
updateSearchResults(newName)
}
)
function fetchUserData(id) {
console.log('Fetching user:', id)
}
function updateSearchResults(name) {
console.log('Searching for:', name)
}
// 在模板中可以直接使用 route.params 和 route.query
</script>
<template>
<div>
<h1>User ID: {{ route.params.id }}</h1>
<p>Name: {{ route.query.name }}</p>
<p>Age: {{ route.query.age }}</p>
</div>
</template>
方法三:使用路由 props 传参 (推荐 – 解耦组件)
这是一种更优雅、组件更独立的方式。将路由参数作为 props 传递给组件。
步骤:
- 在路由配置中启用
props:
// router/index.js
const routes = [
{
path: '/user/:id',
component: UserDetail,
// 方式1: 布尔模式 - 将 params 映射为 props
props: true
},
{
path: '/search',
component: SearchResults,
// 方式2: 函数模式 - 灵活地将 params 和 query 都映射为 props
props: (route) => ({
id: route.params.id,
keyword: route.query.q,
page: parseInt(route.query.page) || 1
})
}
]
- 在组件中声明
props:
<!-- UserDetail.vue -->
<script setup>
// 声明接收来自路由的 props
const props = defineProps({
id: {
type: String,
required: true
}
})
// 现在可以直接使用 props.id
console.log('User ID:', props.id)
</script>
<template>
<div>User ID: {{ id }}</div> <!-- 解构后可直接使用 -->
</template>
优点:
- 组件与
vue-router解耦,可以在任何地方使用。 - 更易于测试(只需传入 props 即可)。
- 代码更清晰,依赖关系明确。
三、 获取参数的完整示例
假设路由配置如下:
{
path: '/article/:id',
name: 'Article',
component: Article,
props: route => ({
id: route.params.id,
from: route.query.from,
category: route.query.category
})
}
访问 URL:/article/456?from=home&category=tech
| 获取方式 | 如何获取 |
|---|---|
this.$route | this.$route.params.id → '456'this.$route.query.from → 'home'this.$route.query.category → 'tech' |
useRoute() | useRoute().params.id → '456'useRoute().query.from → 'home' |
props | 在组件中定义 props: ['id', 'from', 'category'],然后使用 this.id, this.from (Options API) 或 props.id (Composition API) |
总结
| 方法 | 适用场景 | 是否推荐 |
|---|---|---|
this.$route | Options API 项目,快速获取参数。 | ✅ 常用,但需注意监听变化。 |
useRoute() | Vue 3 Composition API 项目。 | ✅ Vue 3 推荐方式。 |
路由 props | 需要组件解耦、提高可测试性和复用性。 | ✅✅ 最佳实践,强烈推荐。 |
核心要点:
- 区分
params(路径参数)和query(查询字符串)。 - 在动态路由切换时,必须监听
$route或route的变化来更新数据。 - 优先考虑使用
props方式,它使组件更纯粹、更易维护。
THE END


