Vue Router является официальным маршрутизатором для Vue.js, обеспечивая организацию навигации внутри одностраничного приложения (SPA). Установка производится через npm или yarn:
npm install vue-router@next
После установки создается экземпляр маршрутизатора, который интегрируется с приложением Vue:
import { createRouter, createWebHistory } from 'vue-router';
import Home from './views/Home.vue';
import About from './views/About.vue';
const routes = [
{ path: '/', component: Home },
{ path: '/about', component: About }
];
const router = createRouter({
history: createWebHistory(),
routes
});
export default router;
В корневом файле приложения подключение маршрутизатора осуществляется
через app.use(router).
Навигация может выполняться с помощью компонентов
и методов экземпляра
маршрутизатора:
О нас
Или программно:
router.push('/about');
router.replace('/about');
router.back();
Важно: push добавляет запись в историю
браузера, replace заменяет текущую запись, а
back возвращает на предыдущую страницу.
Маршруты могут содержать динамические сегменты, обозначаемые двоеточием:
{ path: '/user/:id', component: User }
Доступ к параметрам осуществляется через объект
route:
import { useRoute } from 'vue-router';
export default {
setup() {
const route = useRoute();
console.log(route.params.id);
}
};
Параметры можно отслеживать с помощью реактивных эффектов Vue для реактивного обновления компонента при смене маршрута.
Именованные маршруты упрощают программную навигацию:
{ path: '/profile/:username', name: 'profile', component: Profile }
Навигация по имени:
router.push({ name: 'profile', params: { username: 'ivan' } });
Вложенные маршруты используются для организации сложной структуры
приложения. Родительский маршрут должен содержать
для отображения дочерних
компонентов:
const routes = [
{
path: '/dashboard',
component: Dashboard,
children: [
{ path: 'stats', component: Stats },
{ path: 'settings', component: Settings }
]
}
];
Vue Router предоставляет навигационные охранники для контроля переходов:
router.beforeEach((to, from, next) => {
if (!isAuthenticated && to.name !== 'login') {
next({ name: 'login' });
} else {
next();
}
});
export default {
beforeRouteEnter(to, from, next) {
next(vm => vm.fetchData(to.params.id));
}
};
beforeRouteLeave(to, from, next) {
if (this.hasUnsavedChanges) {
const confirmLeave = window.confirm('Есть несохраненные изменения. Выйти?');
next(confirmLeave);
} else {
next();
}
}
Для оптимизации загрузки SPA рекомендуется использовать ленивую загрузку компонентов:
const About = () => import('./views/About.vue');
const routes = [
{ path: '/about', component: About }
];
Query-параметры передаются через объект query:
router.push({ path: '/search', query: { q: 'vue' } });
Для использования хеша:
router.push({ path: '/home', hash: '#section2' });
Компоненты могут отслеживать изменения маршрута с помощью реактивного
объекта route или хуков watch:
import { useRoute, watch } from 'vue-router';
export default {
setup() {
const route = useRoute();
watch(() => route.fullPath, (newPath) => {
console.log('Путь изменился на', newPath);
});
}
};
Ключевой момент: watch отслеживает
изменения полных путей и позволяет реагировать на переходы между
маршрутами без повторного монтирования компонента.
Маршрутизатор предоставляет доступ к истории браузера, что позволяет реализовывать собственные стратегии навигации:
router.go(-1); // Назад
router.go(2); // Вперед на 2 шага
Также возможно прослушивание событий перехода с помощью событий навигации:
router.afterEach((to, from) => {
console.log(`Перешли с ${from.fullPath} на ${to.fullPath}`);
});
Каждый маршрут может содержать объект meta, который
хранит произвольные данные:
{ path: '/admin', component: Admin, meta: { requiresAuth: true } }
Доступ к метаданным осуществляется через объект
route.meta, что удобно для управления доступом или
отображением UI.
Vue Router оптимизирован для SPA, поддерживает:
const router = createRouter({
history: createWebHistory(),
routes,
scrollBehavior(to, from, savedPosition) {
return savedPosition || { top: 0 };
}
});