В Vue Router динамические сегменты пути позволяют создавать маршруты,
которые могут принимать параметры в URL и использовать их внутри
компонентов. Такие сегменты обозначаются двоеточием (:)
перед именем параметра. Они играют ключевую роль в построении маршрутов
с переменными частями, например, для страниц профиля пользователя,
деталей статьи или товаров в интернет-магазине.
const routes = [
{
path: '/user/:id',
component: UserProfile
}
]
В этом примере сегмент :id является динамическим. Любой
путь, соответствующий шаблону /user/123,
/user/abc или /user/42, будет сопоставлен с
компонентом UserProfile. Значение параметра доступно через
объект route.params.
export default {
computed: {
userId() {
return this.$route.params.id
}
}
}
Маршруты могут содержать несколько динамических сегментов. Каждый
сегмент будет доступен в объекте params по имени,
указанному в пути.
const routes = [
{
path: '/user/:userId/post/:postId',
component: UserPost
}
]
Доступ к параметрам:
export default {
computed: {
userId() {
return this.$route.params.userId
},
postId() {
return this.$route.params.postId
}
}
}
Динамические сегменты могут быть необязательными,
если после имени параметра указать знак вопроса ?.
const routes = [
{
path: '/user/:id?',
component: UserProfile
}
]
В этом случае маршрут /user и /user/123
будут корректно обрабатываться одним компонентом. Необязательные
параметры помогают создавать гибкие маршруты, особенно для фильтров или
страниц с различными уровнями вложенности.
Vue Router поддерживает валидацию параметров с помощью регулярных выражений. Синтаксис включает фигурные скобки после имени параметра.
const routes = [
{
path: '/user/:id(\\d+)',
component: UserProfile
}
]
В этом примере маршрут будет соответствовать только числовым
идентификаторам, таким как /user/123, но не
/user/abc. Использование регулярных выражений позволяет
контролировать корректность URL на уровне маршрутизации.
Для навигации к маршрутам с динамическими сегментами используют
объектный синтаксис в router-link:
<router-link :to="{ name: 'user', params: { id: 123 }}">Профиль</router-link>
При этом важно помнить, что если маршрут использует
именованные маршруты, параметр params
нужно передавать через объект to, а не через строку пути,
чтобы Vue Router корректно построил URL.
По умолчанию, когда динамический параметр изменяется, компонент
не уничтожается и не создается заново. Чтобы
реагировать на изменения параметров, используют наблюдатели
(watch) или beforeRouteUpdate:
export default {
watch: {
'$route.params.id'(newId) {
this.fetchUserData(newId)
}
}
}
Или через beforeRouteUpdate:
export default {
beforeRouteUpdate(to, from, next) {
this.fetchUserData(to.params.id)
next()
}
}
Это особенно важно для страниц, где пользователь может переходить между элементами одного типа, например, постами или продуктами, без полной перезагрузки компонента.
Динамические сегменты могут использоваться в вложенных маршрутах, что позволяет создавать сложную иерархию страниц:
const routes = [
{
path: '/user/:id',
component: UserProfile,
children: [
{
path: 'settings',
component: UserSettings
},
{
path: 'posts/:postId',
component: UserPost
}
]
}
]
Вложенные маршруты наследуют параметры родительского маршрута,
поэтому внутри UserPost доступны как
this.$route.params.id, так и
this.$route.params.postId.
userId вместо
id, если есть несколько идентификаторов.beforeRouteUpdate, чтобы не перезагружать весь
компонент.Динамические сегменты пути предоставляют мощный инструмент для построения гибких и масштабируемых маршрутов, позволяя создавать маршруты с переменными частями URL и эффективно управлять состоянием компонентов при изменении параметров.