В библиотеке Navigo before является
мощным инструментом для управления логикой маршрутов перед их
обработкой. Этот хук позволяет выполнить проверку или подготовку данных
до того, как сработает основной обработчик маршрута. Основное
преимущество — возможность централизованно контролировать доступ к
маршрутам и изменять поведение навигации.
beforerouter.on('/example', () => {
console.log('Маршрут выполнен');
}, {
before: (done, params, route) => {
// Логика перед выполнением маршрута
done();
}
});
Параметры хука before:
:id).path, name и т.д.).beforeХук before может работать асинхронно. Например, проверка
авторизации пользователя:
router.on('/dashboard', () => {
console.log('Доступ к панели управления разрешен');
}, {
before: (done, params, route) => {
fetch('/api/check-auth')
.then(response => response.json())
.then(data => {
if (data.authenticated) {
done();
} else {
router.navigate('/login');
}
});
}
});
В этом примере навигация к /dashboard выполняется только
если пользователь авторизован. В противном случае происходит
перенаправление на /login.
before для всех маршрутовМожно определить хук before для всего роутера:
router.hooks({
before: (done, params, route) => {
console.log(`Переход к маршруту: ${route.path}`);
done();
}
});
Глобальный before вызывается перед обработкой любого
маршрута и отлично подходит для логирования, проверки авторизации или
настройки состояния приложения.
false или блокировка маршрутаЕсли в before не вызвать done, Navigo не
выполнит основной обработчик маршрута. Это позволяет блокировать доступ
на уровне маршрута:
router.on('/admin', () => {
console.log('Админка');
}, {
before: (done) => {
const userIsAdmin = false;
if (userIsAdmin) {
done();
} else {
console.warn('Доступ запрещён');
}
}
});
Важно понимать, что блокировка маршрута не перенаправляет
автоматически — нужно явно вызывать router.navigate() при
необходимости.
Хук before удобно использовать с динамическими
сегментами URL:
router.on('/user/:id', (params) => {
console.log(`Пользователь с ID: ${params.id}`);
}, {
before: (done, params) => {
if (parseInt(params.id) > 0) {
done();
} else {
console.warn('Неверный ID пользователя');
router.navigate('/error');
}
}
});
params позволяет получить значение сегментов URL и
выполнить проверку до рендера страницы.
done(), если маршрут
должен быть обработан. Если done() не вызван, навигация
останавливается.before могут замедлить навигацию.after:
before управляет входом на маршрут, after —
действиями после выполнения обработчика.router.on('/form', () => {
console.log('Форма открыта');
}, {
before: (done) => {
if (formIsDirty()) {
if (confirm('Есть несохранённые данные. Продолжить?')) {
done();
}
} else {
done();
}
}
});
router.on('/delayed', () => {
console.log('Маршрут с задержкой выполнен');
}, {
before: (done) => {
setTimeout(() => {
console.log('Задержка закончена');
done();
}, 1000);
}
});
Эти примеры демонстрируют гибкость хуков before для
реализации различных сценариев, от простой проверки параметров до
асинхронной авторизации и пользовательских предупреждений.
При использовании именованных маршрутов объект route в
before содержит ключ name, что позволяет
писать универсальные проверки для группы маршрутов:
router.on({
'home': '/',
'profile': '/profile'
}, (params, route) => {
console.log(`Переход на ${route.name}`);
}, {
before: (done, params, route) => {
if (route.name === 'profile' && !userLoggedIn()) {
router.navigate('/login');
} else {
done();
}
}
});
before в Navigo обеспечивает мощный контроль над
навигацией, позволяя реализовывать авторизацию, валидацию параметров и
управление состоянием приложения до того, как основной обработчик
маршрута будет вызван. Этот хук является ключевым элементом построения
защищённых и динамичных SPA на чистом JavaScript.