Vue Router является официальной библиотекой маршрутизации для Vue.js и активно развивается вместе с экосистемой. В последних версиях произошли значительные изменения, влияющие на структуру кода и способы организации маршрутов. Эти изменения требуют внимательного подхода при миграции с предыдущих версий.
В версиях до Vue Router 4 использовался синтаксис:
import Vue from 'vue'
import Router from 'vue-router'
import Home from './views/Home.vue'
Vue.use(Router)
export default new Router({
routes: [
{ path: '/', component: Home }
]
})
Начиная с Vue Router 4 синтаксис изменился. Вместо глобальной
регистрации через Vue.use применяется функция
createRouter:
import { createRouter, createWebHistory } from 'vue-router'
import Home from './views/Home.vue'
const routes = [
{ path: '/', component: Home }
]
const router = createRouter({
history: createWebHistory(),
routes
})
export default router
Ключевые моменты:
createWebHistory() или
createWebHashHistory() вместо свойства
mode.Vue.use.router при создании приложения.import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
createApp(App).use(router).mount('#app')
Ранее параметры маршрута были доступны через
this.$route.params, а навигация выполнялась через
this.$router.push. В новой версии API навигация стала более
гибкой и поддерживает объектные формы с типизацией:
router.push({ name: 'user', params: { id: 123 } })
props: true в конфигурации маршрута.query для GET-подобных
параметров:router.push({ path: '/search', query: { q: 'vue' } })
replace, go, back и
forward остались, но теперь возвращают промисы, что
позволяет использовать async/await:await router.push('/about')
Lazy Loading компонентов стал стандартной практикой, особенно для крупных проектов:
const About = () => import('./views/About.vue')
const routes = [
{ path: '/about', component: About }
]
Важные изменения:
NavigationDuplicated.Навигационные охранники (beforeEach,
beforeEnter, beforeRouteLeave) получили
обновления в API:
false отменяет навигацию, а возврат строки или
объекта инициирует редирект:router.beforeEach(async (to, from) => {
if (!isAuthenticated() && to.meta.requiresAuth) {
return { name: 'login' }
}
})
beforeRouteEnter и
beforeRouteUpdate в компонентах теперь позволяют
использовать next с объектом маршрута, поддерживая
асинхронность.Набор методов изменился:
| Метод | Новое поведение |
|---|---|
push |
Возвращает промис, поддерживает async/await |
replace |
Возвращает промис, аналогично push |
go, back, forward |
Возвращают void или промис |
resolve |
Генерирует объект маршрута без навигации |
getRoutes |
Возвращает массив зарегистрированных маршрутов |
Свойства маршрута также обновлены:
this.$route остался, но рекомендуется использовать
Composition API через useRoute() и
useRouter():import { useRoute, useRouter } from 'vue-router'
export default {
setup() {
const route = useRoute()
const router = useRouter()
const goHome = () => router.push('/')
return { route, goHome }
}
}
Эти изменения делают работу с маршрутизацией более предсказуемой, типизированной и совместимой с современными подходами Vue 3.