Vue.js совместно с официальным маршрутизатором Vue Router позволяет строить сложные маршруты с динамическими сегментами, что особенно важно при разработке приложений с множеством страниц, которые зависят от идентификаторов ресурсов, категорий или пользовательских данных.
Динамический маршрут создаётся с использованием параметров
пути, которые обозначаются двоеточием (:) перед
именем параметра. Пример:
const routes = [
{ path: '/user/:id', component: UserProfile }
];
Здесь :id — это динамический сегмент, который может
принимать любое значение. При переходе на /user/123 или
/user/abc компонент UserProfile будет
загружен, а значение параметра id доступно в объекте
маршрута.
Внутри компонента параметры доступны через объект
route:
export default {
mounted() {
console.log(this.$route.params.id);
}
}
Для реактивного отслеживания изменений параметров, например при навигации между пользователями без перезагрузки компонента, рекомендуется использовать наблюдатель:
watch: {
'$route.params.id'(newId) {
this.fetchUserData(newId);
}
}
Это позволяет обновлять данные компонента автоматически при изменении динамического сегмента.
Для удобства и упрощения тестирования параметров маршрута можно передавать их как props в компонент:
const routes = [
{ path: '/user/:id', component: UserProfile, props: true }
];
Теперь компонент получает параметр id как обычное
свойство:
export default {
props: ['id'],
mounted() {
this.fetchUserData(this.id);
}
}
Это делает компонент более изолированным и уменьшает зависимость от объекта маршрута.
По умолчанию динамический параметр является обязательным. Для
необязательных параметров используется знак вопроса
(?):
{ path: '/user/:id?', component: UserProfile }
В этом случае маршрут будет совпадать как с /user/123,
так и с /user.
Vue Router поддерживает маршруты с несколькими динамическими сегментами:
{ path: '/user/:userId/post/:postId', component: PostDetail }
Доступ к параметрам осуществляется через объект
params:
this.$route.params.userId
this.$route.params.postId
Можно использовать динамические маршруты вместе с редиректами или алиасами:
{
path: '/u/:id',
redirect: to => {
return `/user/${to.params.id}`
}
},
{
path: '/profile/:id',
component: UserProfile,
alias: '/me/:id'
}
Редирект вычисляется динамически на основе параметров маршрута, а алиас позволяет использовать несколько путей для одного компонента.
Для ограничения допустимых значений параметров применяются регулярные выражения:
{ path: '/user/:id(\\d+)', component: UserProfile }
Маршрут будет совпадать только с числовыми id, например
/user/42, но не /user/abc.
При переходе между динамическими маршрутами удобно использовать
объектную форму router.push:
this.$router.push({ name: 'user', params: { id: 123 } });
Если маршрут имеет имя, это особенно удобно для построения более устойчивого к изменениям структуры маршрутов кода.
Vue Router поддерживает вложенные маршруты с динамическими сегментами:
const routes = [
{
path: '/user/:id',
component: UserProfile,
children: [
{ path: 'posts', component: UserPosts },
{ path: 'settings', component: UserSettings }
]
}
];
Вложенные компоненты наследуют параметры родительского маршрута, что позволяет использовать их без повторного определения.
Динамические маршруты являются ключевым инструментом для создания масштабируемых и гибких приложений на Vue.js, позволяя эффективно работать с параметрами URL и поддерживать реактивное обновление компонентов при изменении маршрута.