В Quasar Framework маршрутизация организуется с использованием Vue Router, интегрированного с экосистемой Vue 3. Настройка роутинга в SPA позволяет управлять переходами между страницами без полной перезагрузки приложения, обеспечивая плавную работу интерфейса.
Маршруты определяются в файле src/router/routes.js.
Каждый маршрут представляет собой объект с обязательными и опциональными
свойствами:
const routes = [
{
path: '/',
component: () => import('layouts/MainLayout.vue'),
children: [
{ path: '', component: () => import('pages/IndexPage.vue') },
{ path: 'about', component: () => import('pages/AboutPage.vue') },
]
},
{
path: '/login',
component: () => import('layouts/AuthLayout.vue'),
children: [
{ path: '', component: () => import('pages/LoginPage.vue') }
]
},
{
path: '/:catchAll(.*)*',
component: () => import('pages/ErrorNotFound.vue')
}
];
export default routes;
Ключевые моменты:
path — путь маршрута, который отображается в URL.component — компонент Vue, рендерящийся при
переходе.children — вложенные маршруты, используемые для работы
с layout-компонентами.:catchAll(.*)* — универсальный путь для обработки 404
страниц.Для оптимизации SPA используется ленивая загрузка компонентов:
component: () => import('pages/SettingsPage.vue')
Это позволяет загружать компоненты только при необходимости, уменьшая начальный размер бандла и ускоряя загрузку приложения.
Присвоение имени маршруту упрощает навигацию через программный роутинг:
{
path: '/profile/:id',
name: 'profile',
component: () => import('pages/ProfilePage.vue')
}
Навигация к маршруту может выполняться с помощью:
this.$router.push({ name: 'profile', params: { id: 123 } });
Использование именованных маршрутов делает код более читаемым и защищает от изменений URL-путей.
Для реализации аутентификации и контроля доступа используются navigation guards:
router.beforeEach((to, from, next) => {
const isAuthenticated = store.getters['auth/isLoggedIn'];
if (to.meta.requiresAuth && !isAuthenticated) {
next({ name: 'login' });
} else {
next();
}
});
Пояснения:
beforeEach — глобальный guard, срабатывающий перед
каждым переходом.to.meta.requiresAuth — пользовательская мета-информация
для маршрута.next() — функция продолжения навигации; можно передать
объект для редиректа.Мета-поля позволяют хранить дополнительную информацию о маршруте, например, заголовки страниц или необходимость авторизации:
{
path: '/dashboard',
component: () => import('pages/DashboardPage.vue'),
meta: { requiresAuth: true, title: 'Панель управления' }
}
Использование мета-полей в компонентах layout позволяет динамически изменять заголовки или отображение элементов интерфейса.
Для страниц, где часть пути зависит от данных, применяются динамические сегменты:
{
path: '/product/:id',
name: 'product',
component: () => import('pages/ProductPage.vue')
}
В компоненте доступ к параметрам осуществляется через
this.$route.params.id.
Навигация в SPA может быть выполнена через методы Vue Router:
// Прямой переход
this.$router.push('/home');
// С именованным маршрутом
this.$router.push({ name: 'profile', params: { id: 5 } });
// Редирект
{
path: '/old-path',
redirect: '/new-path'
}
Редиректы позволяют поддерживать устаревшие URL и управлять структурой маршрутов без изменения пользовательского опыта.
Quasar автоматически поддерживает код-сплиттинг через синтаксис динамического импорта. Для больших приложений рекомендуется разбивать страницы на отдельные чанки:
const routes = [
{
path: '/analytics',
component: () => import('pages/AnalyticsPage.vue' /* webpackChunkName: "analytics" */)
}
]
Это уменьшает размер основного бандла и повышает производительность SPA.
Quasar активно использует концепцию layout-компонентов для структурирования страниц:
{
path: '/',
component: () => import('layouts/MainLayout.vue'),
children: [
{ path: '', component: () => import('pages/HomePage.vue') },
{ path: 'settings', component: () => import('pages/SettingsPage.vue') }
]
}
Особенности:
<router-view>
layout-компонента.Для SPA важно управлять прокруткой при переходе между страницами:
const router = createRouter({
routes,
scrollBehavior(to, from, savedPosition) {
if (savedPosition) {
return savedPosition;
} else {
return { left: 0, top: 0 };
}
}
});
savedPosition — координаты скролла при навигации
назад.{ left: 0, top: 0 } обеспечивает скролл в
начало страницы при переходе на новую страницу.Маршруты SPA поддерживают передачу параметров через query и hash:
this.$router.push({ path: '/search', query: { q: 'vue' }, hash: '#results' });
query используется для фильтров, поисковых
запросов.hash позволяет привязываться к конкретным секциям
страницы.Часто маршруты зависят от состояния приложения. Quasar и Vue Router легко интегрируются с Vuex или Pinia:
router.beforeEach((to, from, next) => {
const isAdmin = store.getters['user/isAdmin'];
if (to.meta.requiresAdmin && !isAdmin) {
next({ name: 'home' });
} else {
next();
}
});
Методы навигации и guards позволяют реализовать гибкую систему прав доступа без дублирования логики в компонентах.
Quasar поддерживает анимацию переходов между страницами через
стандартные Vue <transition> и
<router-view>:
<transition name="fade" mode="out-in">
<router-view />
</transition>
Можно определять кастомные CSS-анимации, чтобы улучшить пользовательский опыт и визуальную плавность SPA.
Эти механизмы вместе формируют гибкую, масштабируемую архитектуру маршрутизации в приложениях Quasar, обеспечивая удобную организацию страниц, эффективное управление компонентами и динамическую работу с данными.