Навигационные охранники являются ключевым инструментом для управления доступом к маршрутам в приложениях на базе Quasar и Vue Router. Они позволяют выполнять проверку состояния приложения, авторизации пользователя, предзагрузку данных и другие операции до того, как маршрут будет активирован.
Глобальные охранники (Global Guards) Эти охранники применяются ко всем маршрутам приложения и задаются при конфигурации маршрутизатора.
beforeEach Вызывается перед каждым переходом на новый маршрут. Позволяет отменить или перенаправить переход.
import { route } from 'quasar/wrappers';
import { createRouter, createMemoryHistory } from 'vue-router';
import routes from './routes';
const router = createRouter({
history: createMemoryHistory(),
routes
});
router.beforeEach((to, from, next) => {
const isAuthenticated = false; // логика проверки авторизации
if (to.meta.requiresAuth && !isAuthenticated) {
next({ name: 'login' });
} else {
next();
}
});
export default router;beforeResolve Срабатывает после beforeEach, но перед подтверждением перехода. Часто используется для асинхронной загрузки данных.
afterEach Вызывается после завершения перехода.
Не принимает next() и используется для логирования или
аналитики.
router.afterEach((to, from) => {
console.log(`Переход с ${from.fullPath} на ${to.fullPath}`);
});Охранники маршрута (Route Guards) Определяются
непосредственно в конфигурации маршрута через свойства
beforeEnter. Применяются только к конкретному маршруту.
{
path: '/dashboard',
component: () => import('pages/Dashboard.vue'),
beforeEnter: (to, from, next) => {
const hasAccess = true; // логика проверки доступа
if (hasAccess) {
next();
} else {
next({ name: 'home' });
}
}
}Охранники компонента (In-Component Guards) Определяются внутри компонентов и управляют переходом при активном компоненте. Существуют три основных метода:
beforeRouteEnter Вызывается перед рендерингом
компонента. Не имеет доступа к this, поэтому для работы с
экземпляром компонента используют колбэк:
beforeRouteEnter(to, from, next) {
next(vm => {
vm.loadData();
});
}beforeRouteUpdate Срабатывает при переходе на тот же компонент с другим маршрутом (например, изменение параметра):
beforeRouteUpdate(to, from, next) {
this.fetchData(to.params.id);
next();
}beforeRouteLeave Позволяет контролировать выход из компонента:
beforeRouteLeave(to, from, next) {
const answer = window.confirm('Вы уверены, что хотите покинуть страницу?');
if (answer) next();
else next(false);
}Для упрощения условий охранников часто используют поле
meta в маршрутах. Оно может содержать информацию о
необходимости авторизации, ролях пользователя или других условиях.
{
path: '/admin',
component: () => import('pages/Admin.vue'),
meta: { requiresAuth: true, roles: ['admin'] }
}
В глобальном охраннике можно проверять это так:
router.beforeEach((to, from, next) => {
const isAuthenticated = true;
const userRole = 'admin';
if (to.meta.requiresAuth && !isAuthenticated) {
next({ name: 'login' });
} else if (to.meta.roles && !to.meta.roles.includes(userRole)) {
next({ name: 'not-authorized' });
} else {
next();
}
});
Навигационные охранники поддерживают асинхронные действия. Можно
использовать async/await для загрузки данных или проверки с
сервера:
router.beforeEach(async (to, from, next) => {
try {
const isAuthenticated = await checkAuth();
if (to.meta.requiresAuth && !isAuthenticated) {
next({ name: 'login' });
} else {
next();
}
} catch (error) {
console.error(error);
next(false); // отмена перехода
}
});
beforeEach → beforeEnter → in-component beforeRouteEnter → beforeResolve → afterEach.meta для хранения условий доступа, чтобы
охранники оставались универсальными.next() или перенаправление, иначе
переход будет заблокирован.try/catch и
корректно обрабатывать ошибки.Навигационные охранники в Quasar обеспечивают гибкий контроль маршрутов, защищают доступ и позволяют управлять состоянием приложения при переходах, обеспечивая стабильность и безопасность интерфейса.