Vue Router является официальной библиотекой маршрутизации для Vue.js, обеспечивая возможность создания одностраничных приложений (SPA) с динамической навигацией. Основным объектом в Vue Router является Router, который содержит набор маршрутов и методы управления навигацией.
Маршрут описывается объектом вида:
const routes = [
{ path: '/', component: Home },
{ path: '/about', component: About },
{ path: '/users/:id', component: User }
];
path — путь URL.component — компонент Vue, который будет отображен при
переходе.:id) позволяют обрабатывать
параметры маршрута.Создание экземпляра роутера:
import { createRouter, createWebHistory } from 'vue-router';
const router = createRouter({
history: createWebHistory(),
routes
});
Интеграция роутера в Vue-приложение:
import { createApp } from 'vue';
import App from './App.vue';
createApp(App).use(router).mount('#app');
Для оптимизации загрузки крупных приложений применяются динамические маршруты с ленивым импортом:
const routes = [
{
path: '/settings',
component: () => import('./components/Settings.vue')
}
];
Преимущества:
Использование именованных маршрутов облегчает навигацию:
{ path: '/profile/:id', name: 'profile', component: Profile }
Навигация по имени:
router.push({ name: 'profile', params: { id: 42 } });
Vue Router предоставляет несколько типов хуков для контроля навигации:
Глобальные хуки
router.beforeEach((to, from, next) => {
if (to.meta.requiresAuth && !isAuthenticated()) {
next('/login');
} else {
next();
}
});
beforeEach — вызывается перед каждой навигацией.afterEach — вызывается после завершения навигации, не
поддерживает next().Локальные хуки компонентов
export default {
beforeRouteEnter(to, from, next) {
next(vm => vm.fetchData(to.params.id));
}
}
beforeRouteEnter — до монтирования компонента.beforeRouteUpdate — при изменении параметров
маршрута.beforeRouteLeave — перед уходом с маршрута, можно
предотвратить переход.Динамические параметры доступны через to.params:
const userId = to.params.id;
Параметры query — через to.query:
const filter = to.query.filter;
Навигация с query-параметрами:
router.push({ path: '/users', query: { filter: 'active' } });
router.push(location) — добавление записи в
историю.router.replace(location) — замена текущей записи.router.go(n) — переход вперед/назад по истории.router.back() / router.forward() — удобные
методы для навигации по истории браузера.Vue Router интегрируется с компонентом
для анимации переходов:
mode="out-in" гарантирует полное завершение ухода
компонента перед входом нового.Каждый маршрут может содержать объект meta, хранящий
дополнительные данные:
{ path: '/admin', component: Admin, meta: { requiresAuth: true } }
Метаданные используются в навигационных хуках, например, для проверки прав доступа:
router.beforeEach((to, from, next) => {
if (to.meta.requiresAuth && !isAuthenticated()) {
next('/login');
} else {
next();
}
});
Поддержка вложенных маршрутов позволяет создавать сложные интерфейсы:
const routes = [
{
path: '/dashboard',
component: Dashboard,
children: [
{ path: '', component: Overview },
{ path: 'stats', component: Stats }
]
}
];
для отображения дочерних маршрутов.Для больших приложений важна диагностика производительности маршрутизации:
router.beforeEach((to, from, next) => {
to.meta.startTime = performance.now();
next();
});
router.afterEach((to, from) => {
const duration = performance.now() - to.meta.startTime;
console.log(`Navigation to ${to.fullPath} took ${duration.toFixed(2)}ms`);
});
с
v-if или v-show для скрытия компонентов без их
удаления.Для SPA важно контролировать позицию скролла при навигации:
const router = createRouter({
history: createWebHistory(),
routes,
scrollBehavior(to, from, savedPosition) {
if (savedPosition) return savedPosition;
if (to.hash) return { el: to.hash, beh * avior: 'smooth' };
return { top: 0 };
}
});
savedPosition используется при навигации
назад/вперед.beh * avior: 'smooth') улучшает
UX.Vue Router поддерживает хранение состояния при навигации через
history.state:
router.push({ path: '/profile', state: { tab: 'settings' } });
console.log(history.state.tab); // 'settings'
Навигационные хуки могут возвращать промисы для асинхронных операций:
router.beforeEach(async (to, from) => {
const authorized = await checkAuth();
if (!authorized) return '/login';
});
router.onError:router.onError(error => {
console.error('Router error:', error);
});