Vue Router 4 является полной переработкой маршрутизатора для Vue 3 и отличается от Vue Router 3 как синтаксисом, так и концепциями работы с маршрутизацией. Основные изменения касаются совместимости с Composition API, нового подхода к маршрутам и способа управления историей браузера.
В Vue Router 3 маршрутизатор создавался через
new VueRouter({ routes }) и передавался в экземпляр
Vue:
import Vue from 'vue';
import VueRouter from 'vue-router';
import Home from './components/Home.vue';
Vue.use(VueRouter);
const routes = [
{ path: '/', component: Home }
];
const router = new VueRouter({
mode: 'history',
routes
});
new Vue({
router,
render: h => h(App)
}).$mount('#app');
В Vue Router 4 создаётся новый экземпляр через функцию
createRouter и используется объект истории
createWebHistory или createWebHashHistory:
import { createRouter, createWebHistory } from 'vue-router';
import Home from './components/Home.vue';
const routes = [
{ path: '/', component: Home }
];
const router = createRouter({
history: createWebHistory(),
routes
});
export default router;
Ключевые изменения:
createRouter вместо
new VueRouter.app.use(router).В Vue Router 4 маршрутизатор подключается к приложению следующим образом:
import { createApp } from 'vue';
import App from './App.vue';
import router from './router';
const app = createApp(App);
app.use(router);
app.mount('#app');
Теперь маршрутизатор полностью соответствует архитектуре Vue 3 и Composition API.
В Vue Router 3 навигация происходила через методы
$router.push, $router.replace и
<router-link>:
this.$router.push('/about');
В Vue Router 4 сохраняются те же методы, но добавлена поддержка Promise для навигации, что упрощает обработку ошибок:
import { useRouter } from 'vue-router';
const router = useRouter();
router.push('/about').catch(err => {
if (err.name !== 'NavigationDuplicated') throw err;
});
Ключевые изменения:
NavigationDuplicated больше не выбрасывается
автоматически при повторной навигации, теперь обработка ошибок через
.catch.useRouter() и useRoute() вместо
$router и $route.В Vue Router 3:
this.$route.params.id;
В Vue Router 4 с Composition API:
import { useRoute } from 'vue-router';
const route = useRoute();
console.log(route.params.id);
Изменения:
useRoute() возвращает реактивный
объект, что позволяет отслеживать изменения маршрута в
реактивных вычислениях (computed) и эффектах
(watch).route.query и route.params теперь
полностью совместимы с реактивной системой Vue 3.Vue Router 4 сохраняет поддержку динамических маршрутов через
:param и ленивой загрузки компонентов через
defineAsyncComponent или динамический импорт:
const routes = [
{
path: '/user/:id',
component: () => import('./components/User.vue')
}
];
Особенности Vue Router 4:
props: true для автоматической
передачи параметров маршрута в компонент:{ path: '/user/:id', component: User, props: true }
Vue Router 4 сохранил beforeEach,
beforeResolve и afterEach, но добавлена
поддержка Composition API в маршрутах через
beforeRouteEnter, beforeRouteUpdate и
beforeRouteLeave:
import { onBeforeRouteUpdate } from 'vue-router';
export default {
setup() {
onBeforeRouteUpdate((to, from) => {
console.log('Маршрут обновился', to.fullPath);
});
}
};
Promise.Vue Router 3 поддерживает режимы hash и
history через mode. В Vue Router 4 для этого
используются отдельные функции:
import { createWebHistory, createWebHashHistory } from 'vue-router';
const router = createRouter({
history: createWebHistory(), // history mode
routes
});
const hashRouter = createRouter({
history: createWebHashHistory(), // hash mode
routes
});
Преимущества:
createMemoryHistory.В Vue Router 3:
this.$router.push({ path: '/user', query: { id: 123 } });
В Vue Router 4:
router.push({ name: 'user', query: { id: 123 } });
Изменения:
type и
error.useRouter, useRoute, реактивные guards.createWebHistory, createWebHashHistory).createRouter вместо
new VueRouter.Эти изменения делают Vue Router 4 более современным, гибким и оптимизированным для архитектуры Vue 3, сохраняя привычные возможности Vue Router 3, но с улучшенной интеграцией и реактивностью.