Vue Router — это официальная библиотека маршрутизации для фреймворка Vue.js, которая обеспечивает управление навигацией между компонентами и страницами приложения. Она позволяет создавать одностраничные приложения (SPA), где переход между страницами происходит без полной перезагрузки браузера, сохраняя состояние приложения и обеспечивая плавный пользовательский опыт.
Для начала работы необходимо установить библиотеку через npm:
npm install vue-router@next
Для Vue 3 используется версия next, а для Vue 2 —
стандартная версия. После установки импортируем и подключаем
маршрутизатор:
import { createRouter, createWebHistory } from 'vue-router';
import Home from './components/Home.vue';
import About from './components/About.vue';
const routes = [
{ path: '/', component: Home },
{ path: '/about', component: About }
];
const router = createRouter({
history: createWebHistory(),
routes
});
export default router;
В основном файле приложения подключение Vue Router выглядит так:
import { createApp } from 'vue';
import App from './App.vue';
import router from './router';
createApp(App)
.use(router)
.mount('#app');
Маршруты определяются в массиве объектов, где каждый объект содержит:
Пример с передачей параметров:
const routes = [
{
path: '/user/:id',
name: 'user',
component: () => import('./components/User.vue'),
props: true
}
];
Для перехода между страницами используются два основных метода:
<router-link> —
создает ссылку для навигации без перезагрузки страницы:<router-link to="/">Главная</router-link>
<router-link :to="{ name: 'user', params: { id: 123 }}">Профиль</router-link>
router:this.$router.push({ name: 'user', params: { id: 123 } });
this.$router.replace('/about');
Разница между push и replace заключается в
том, что replace заменяет текущую запись в истории
браузера, а push добавляет новую.
Vue Router поддерживает динамические сегменты URL с использованием
:param:
{
path: '/post/:postId',
component: Post,
props: true
}
Передача параметра postId в компонент:
export default {
props: ['postId'],
mounted() {
console.log(this.postId);
}
}
Для необязательных параметров можно использовать ?:
{
path: '/category/:id?',
component: Category
}
Вложенные маршруты позволяют отображать компоненты внутри других
компонентов. Для этого используется свойство children:
const routes = [
{
path: '/dashboard',
component: Dashboard,
children: [
{ path: 'stats', component: Stats },
{ path: 'settings', component: Settings }
]
}
];
В родительском компоненте необходимо указать
<router-view> для отображения дочерних маршрутов:
<template>
<div>
<h1>Панель управления</h1>
<router-view></router-view>
</div>
</template>
Vue Router предоставляет возможность перехватывать переходы между маршрутами и выполнять действия перед или после навигации:
router.beforeEach((to, from, next) => {
if (to.meta.requiresAuth && !isAuthenticated()) {
next('/login');
} else {
next();
}
});
const routes = [
{
path: '/admin',
component: Admin,
beforeEnter: (to, from, next) => {
if (!isAdmin()) next('/unauthorized');
else next();
}
}
];
export default {
beforeRouteEnter(to, from, next) {
next(vm => vm.loadData());
}
}
Vue Router поддерживает несколько стратегий истории:
#.#), поддерживает старые браузеры.Пример:
const router = createRouter({
history: createWebHistory(),
routes
});
Для оптимизации загрузки крупных приложений рекомендуется использовать ленивую загрузку компонентов:
const routes = [
{
path: '/about',
component: () => import('./components/About.vue')
}
];
Компонент будет загружен только при переходе по маршруту
/about, что ускоряет начальную загрузку приложения.
Свойство meta позволяет добавлять произвольные данные к
маршруту:
const routes = [
{
path: '/profile',
component: Profile,
meta: { requiresAuth: true }
}
];
Обычно используется совместно с глобальными охранниками для контроля доступа.
<router-view> и <router-link><router-view> — основной
контейнер для отображения компонентов маршрутов.<router-link> — генерирует
ссылки, поддерживающие активное состояние через
active-class:<router-link to="/about" active-class="active-link">О сайте</router-link>
<router-view></router-view>
<router-view> для дочерних
маршрутов.При использовании Vue Router навигация выполняется без перезагрузки страницы, поэтому:
<keep-alive>
<router-view></router-view>
</keep-alive>
<transition>:<transition name="fade" mode="out-in">
<router-view></router-view>
</transition>
this.$router.push({ path: '/search', query: { q: 'Vue' } });
router.push('/home').catch(err => {
if (err.name !== 'NavigationDuplicated') throw err;
});
{
path: '/home',
redirect: '/'
},
{
path: '/profile',
alias: '/me',
component: Profile
}
const router = createRouter({
history: createWebHistory(),
routes,
scrollBehavior(to, from, savedPosition) {
return savedPosition || { top: 0 };
}
});
Vue Router предоставляет гибкий и мощный инструмент для построения навигации в одностраничных приложениях. Он интегрируется с Vue.js естественно, поддерживает маршруты с параметрами, вложенные маршруты, ленивую загрузку компонентов и управление доступом через охранники.