Vue Router, начиная с версии 4, претерпел значительные изменения в синтаксисе и способах настройки маршрутизации. Основной акцент сделан на модульность, поддерживаемость TypeScript и удобство динамической маршрутизации.
В новой версии маршрутизатор создается через функцию
createRouter, а не через конструктор
new VueRouter, как это было в Vue 2:
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;
Ключевые изменения:
createWebHistory или
createWebHashHistory вместо
mode: 'history'/'hash'.routes, без
дополнительных параметров конструктора.Вложенные маршруты теперь определяются через свойство
children:
const routes = [
{
path: '/dashboard',
component: () => import('./views/Dashboard.vue'),
children: [
{ path: '', component: () => import('./views/DashboardHome.vue') },
{ path: 'settings', component: () => import('./views/DashboardSettings.vue') }
]
}
];
Особенности синтаксиса:
component: () => import(...) позволяет
динамически загружать компоненты, что уменьшает размер бандла и ускоряет
начальную загрузку.Новый синтаксис для динамических сегментов пути:
const routes = [
{ path: '/user/:id', component: () => import('./views/UserProfile.vue') }
];
Доступ к параметрам теперь осуществляется через useRoute
внутри компонента:
import { useRoute } from 'vue-router';
export default {
setup() {
const route = useRoute();
const userId = route.params.id;
return { userId };
}
};
Изменения против Vue 2:
$route напрямую в
this.Вместо $router.push({ path: '/about' }) сохраняется
синтаксис, но с поддержкой промисов:
import { useRouter } from 'vue-router';
export default {
setup() {
const router = useRouter();
const goToAbout = async () => {
try {
await router.push('/about');
} catch (err) {
if (err.name !== 'NavigationDuplicated') {
throw err;
}
}
};
return { goToAbout };
}
};
Особенности:
push и replace возвращают промис, что
позволяет обрабатывать ошибки навигации.NavigationDuplicated теперь отлавливается
стандартным try/catch или с помощью onError.Синтаксис обновился с использованием функций вместо методов экземпляра:
router.beforeEach((to, from, next) => {
if (to.meta.requiresAuth && !isLoggedIn()) {
next({ path: '/login' });
} else {
next();
}
});
Дополнительные возможности:
beforeRouteEnter, beforeRouteUpdate,
beforeRouteLeave работают как раньше, но полностью
совместимы с Composition API.meta) используются для управления
доступом, логикой отображения меню и других условий.Vue Router 4 активно поддерживает ленивую загрузку компонентов:
const routes = [
{ path: '/profile', component: () => import('./views/Profile.vue') }
];
Преимущества:
component: () => import(/* webpackChunkName: "profile" */ './views/Profile.vue')
В новой версии промисы push и replace
позволяют централизованно обрабатывать ошибки:
router.push('/home').catch(err => {
if (err.name !== 'NavigationDuplicated') {
console.error(err);
}
});
Это упрощает работу с одинаковыми маршрутами, исключая ненужные ошибки.
createRouter и истории
через
createWebHistory/createWebHashHistory.import() и
ленивый рендеринг.useRouter и
useRoute.Эти изменения делают Vue Router более современным, модульным и оптимизированным для крупных проектов, где важна скорость загрузки, строгая типизация и удобное управление навигацией.