Vue Router предоставляет мощные возможности для работы с параметрами
маршрутов, что позволяет динамически передавать данные между
компонентами и управлять состоянием приложения через URL. Параметры
маршрутов делятся на два основных типа: путьовые
параметры (params) и параметры
запроса (query). Каждый из этих типов имеет свои
особенности использования и способы получения в компонентах.
params)Путьовые параметры задаются непосредственно в пути маршрута через
двоеточие (:). Например:
const routes = [
{
path: '/user/:id',
component: UserProfile
}
]
В этом примере :id является динамическим сегментом
маршрута. Любое значение, подставленное в URL после /user/,
будет доступно в компоненте UserProfile.
Доступ к параметрам:
this.$route.params:export default {
computed: {
userId() {
return this.$route.params.id;
}
}
}
useRoute:import { useRoute } from 'vue-router';
export default {
setup() {
const route = useRoute();
const userId = route.params.id;
return { userId };
}
}
Особенности:
watch) или
beforeRouteUpdate хук.watch(
() => route.params.id,
(newId, oldId) => {
console.log(`Маршрут изменился с ${oldId} на ${newId}`);
}
);
или
export default {
beforeRouteUpdate(to, from, next) {
console.log(`Обновление маршрута с ${from.params.id} на ${to.params.id}`);
next();
}
}
query)Параметры запроса добавляются в URL после символа ? и
могут содержать несколько значений:
/users?sort=desc&page=2
Доступ к параметрам:
this.$route.query:export default {
computed: {
sortOrder() {
return this.$route.query.sort;
},
pageNumber() {
return Number(this.$route.query.page);
}
}
}
import { useRoute } from 'vue-router';
export default {
setup() {
const route = useRoute();
const sortOrder = route.query.sort;
const pageNumber = Number(route.query.page);
return { sortOrder, pageNumber };
}
}
Особенности:
query не уничтожает компонент, поэтому важно
отслеживать изменения через watch или
watchEffect.watch(
() => route.query.page,
(newPage) => {
console.log(`Текущая страница: ${newPage}`);
}
);
Использование программной навигации:
// С использованием пути
router.push(`/user/${userId}`);
// С использованием объекта
router.push({ name: 'user', params: { id: userId } });
// С query
router.push({ path: '/users', query: { page: 2, sort: 'desc' } });
Особенности params и query при
навигации:
params предпочтительно указывать имя
маршрута через name, чтобы Vue Router корректно подставил
параметр.query всегда передаются как объект и
сериализуются автоматически.Вложенные компоненты, используемые в маршрутах, могут получать
параметры через props, что упрощает тестирование и делает
компоненты более декларативными.
const routes = [
{
path: '/user/:id',
component: UserProfile,
props: true
}
]
Теперь компонент UserProfile получает id
как обычный пропс:
export default {
props: ['id'],
mounted() {
console.log(`ID пользователя: ${this.id}`);
}
}
Можно также использовать функцию для более гибкой передачи данных:
props: route => ({ userId: route.params.id, sortOrder: route.query.sort })
| Тип параметра | Доступ через | Примечание |
|---|---|---|
Путьовой (params) |
this.$route.params |
Динамические сегменты URL, обязательны в маршруте |
Запрос (query) |
this.$route.query |
Не обязательны, передаются после ? |
| Props | Передача в компонент | Позволяет компонентым оставаться декларативными и тестируемыми |
params для обязательных идентификаторов и
ключевых ресурсов.query для фильтров, сортировки и
параметров пагинации.watch или
beforeRouteUpdate для корректного обновления данных.props для передачи
параметров в компоненты, что улучшает читаемость и упрощает
тестирование.