Динамическое сопоставление маршрутов — это мощная возможность Vue Router, позволяющая обрабатывать URL-адреса с переменными сегментами, где часть пути может меняться, но должна обрабатываться одним компонентом.
Вместо жесткого задания всех возможных путей, вы можете определить маршрут с динамическим сегментом, который будет сопоставляться с разными значениями. Это реализуется через параметры маршрута.
Динамические сегменты обозначаются двоеточием :
:
const routes = [
// динамический параметр начинается с :
{ path: '/user/:id', component: User }
]
В этом примере:
/user/1
→ params: { id: '1' }
/user/42
→ params: { id: '42' }
/user/abc
→ params: { id: 'abc' }
Получить параметры можно через объект $route
или с помощью Composition API:
export default {
computed: {
userId() {
return this.$route.params.id
}
}
}
import { useRoute } from 'vue-router'
export default {
setup() {
const route = useRoute()
const userId = computed(() => route.params.id)
return { userId }
}
}
Важно понимать, что при переходе между разными значениями одного динамического маршрута:
watch(
() => route.params.id,
(newId) => {
// выполнить действия при изменении id
}
)
{ path: '/user/:userId/post/:postId', component: UserPost }
{ path: '/user/:userId?', component: User } // userId не обязателен
Можно ограничить формат параметра:
{ path: '/user/:id(\\d+)', component: User } // только цифры
{ path: '/user/:id([a-z]+)', component: User } // только буквы
{ path: '/:pathMatch(.*)*', component: NotFound }
Допустим, у нас есть приложение блога:
const routes = [
{
path: '/post/:slug',
component: Post,
props: true // можно передавать params как props
}
]
Компонент Post может использовать параметр:
<template>
<div v-if="post">
<h1>{{ post.title }}</h1>
<p>{{ post.content }}</p>
</div>
</template>
<script>
export default {
props: ['slug'],
data() {
return {
post: null
}
},
async created() {
this.post = await fetchPostBySlug(this.slug)
},
watch: {
slug(newSlug) {
this.fetchPostBySlug(newSlug)
}
}
}
</script>
$route.params
или useRoute()
Эта функциональность особенно полезна для: