В библиотеке Quasar, построенной на базе Vue.js и Vue Router,
вложенные маршруты позволяют организовать приложение с
многоуровневой навигацией. Это особенно актуально для сложных
интерфейсов, где одна страница содержит несколько подстраниц или
компонентов. В Quasar структура маршрутов описывается в файле
routes.js (или 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: 'dashboard',
component: () => import('layouts/DashboardLayout.vue'),
children: [
{ path: '', component: () => import('pages/dashboard/Overview.vue') },
{ path: 'settings', component: () => import('pages/dashboard/Settings.vue') },
{ path: 'analytics', component: () => import('pages/dashboard/Analytics.vue') }
]
}
]
}
]
export default routes
В этом примере ключевым моментом является дополнительный
уровень вложенности для dashboard. Главный путь
'/' использует MainLayout.vue, внутри которого
находятся дочерние маршруты. Для раздела 'dashboard'
подключается отдельный макет DashboardLayout.vue, и внутри
него уже можно организовать свои подстраницы.
<router-view> для вложенных маршрутовДля корректного отображения вложенных маршрутов важно правильно
разместить компонент <router-view> внутри
родительского макета. Каждый уровень вложенности должен иметь
собственный <router-view>:
<template>
<q-layout view="lHh Lpr lFf">
<q-header elevated>
<q-toolbar>
<q-toolbar-title>Dashboard</q-toolbar-title>
</q-toolbar>
</q-header>
<q-page-container>
<router-view />
</q-page-container>
</q-layout>
</template>
<router-view> в MainLayout.vue
рендерит все дочерние страницы основного маршрута.<router-view> в DashboardLayout.vue
рендерит страницы overview, settings и
analytics.Это обеспечивает модульность интерфейса и позволяет строить сложные многоуровневые макеты без дублирования кода.
Для перехода между вложенными маршрутами используется
router-link с указанием полного пути или имен маршрутов. В
Quasar предпочтительно использовать компоненты q-btn или
q-item с to:
<q-list>
<q-item to="/dashboard" clickable>Overview</q-item>
<q-item to="/dashboard/settings" clickable>Settings</q-item>
<q-item to="/dashboard/analytics" clickable>Analytics</q-item>
</q-list>
Для динамической навигации в скриптах можно использовать
$router.push() или $router.replace():
this.$router.push({ path: '/dashboard/settings' })
Quasar поддерживает динамические параметры в маршрутах, что позволяет строить страницы с изменяемым содержимым:
{
path: 'dashboard/user/:id',
component: () => import('pages/dashboard/UserProfile.vue'),
props: true
}
Компонент UserProfile.vue получает параметр
id как пропс:
<template>
<div>
<h2>Профиль пользователя {{ id }}</h2>
</div>
</template>
<script>
export default {
props: ['id']
}
</script>
Это позволяет создавать универсальные страницы профилей или деталей объектов, используя один компонент для разных маршрутов.
Для вложенных маршрутов можно применять глобальные и
локальные охранники маршрутов (beforeEnter,
beforeRouteEnter) для ограничения доступа:
{
path: 'dashboard/settings',
component: () => import('pages/dashboard/Settings.vue'),
beforeEnter: (to, from, next) => {
const userIsAdmin = true // пример проверки
if (userIsAdmin) next()
else next('/login')
}
}
Глобальные охранники настраиваются в
router/index.js:
router.beforeEach((to, from, next) => {
const requiresAuth = to.meta.requiresAuth
if (requiresAuth && !userLoggedIn()) next('/login')
else next()
})
Такой подход позволяет контролировать доступ к отдельным подстраницам внутри вложенных маршрутов.
В Quasar для вложенных маршрутов рекомендуется использовать ленивую загрузку компонентов через динамический импорт. Это снижает размер начального бандла и ускоряет загрузку приложения:
component: () => import('pages/dashboard/Analytics.vue')
Каждый дочерний маршрут загружается только при первом обращении, что критично для крупных приложений с множеством подстраниц.
Для удобства поддержания вложенной навигации следует использовать иерархическую структуру директорий:
src/
├─ layouts/
│ ├─ MainLayout.vue
│ └─ DashboardLayout.vue
├─ pages/
│ ├─ IndexPage.vue
│ ├─ AboutPage.vue
│ └─ dashboard/
│ ├─ Overview.vue
│ ├─ Settings.vue
│ └─ Analytics.vue
└─ router/
└─ routes.js
Такое разделение позволяет легко ориентироваться в маршрутах и макетах, а также упрощает подключение новых вложенных страниц.
<router-view> для
каждого уровня вложенности.Такой подход к организации вложенных маршрутов в Quasar обеспечивает чистую архитектуру приложения, упрощает навигацию и поддерживает высокую производительность при работе с большим количеством страниц.