Метод page.redirect() в библиотеке
Page.js используется для программной навигации между
маршрутами, аналогично переходу пользователя по ссылке, но без
перезагрузки страницы. Он является важным инструментом при реализации
SPA (Single Page Application), обеспечивая плавный переход между
страницами приложения.
Синтаксис метода:
page.redirect(path, [state]);
path – обязательный параметр. Строка,
указывающая путь, на который необходимо выполнить перенаправление.state – необязательный параметр.
Объект состояния, который будет передан в новый маршрут и доступен через
объект ctx.state.page.redirect() в маршрутахМетод часто используется внутри обработчиков маршрутов для реализации условий навигации. Например, перенаправление на страницу логина при отсутствии авторизации:
page('/dashboard', ctx => {
if (!ctx.user) {
page.redirect('/login');
} else {
renderDashboard(ctx);
}
});
В этом примере:
ctx.user)./login.page.redirect() от page.show()Важно понимать разницу между page.redirect() и
page.show():
page.redirect(): выполняет
перенаправление маршрута и формирует новый путь в истории браузера.
Старый маршрут не обрабатывается после вызова.page.show(): непосредственно вызывает
обработчик маршрута без изменения URL в истории браузера.Пример разницы:
page('/old', () => {
console.log('Старый маршрут');
page.redirect('/new'); // Перенаправление на новый маршрут
});
page('/new', () => {
console.log('Новый маршрут');
});
Результат: в консоли будет только "Новый маршрут", а URL
изменится на /new.
state при перенаправленииАргумент state позволяет передавать данные между
маршрутами без использования query-параметров:
page('/form', ctx => {
if (!ctx.user) {
page.redirect('/login', { reason: 'not_authenticated' });
}
});
page('/login', ctx => {
if (ctx.state.reason === 'not_authenticated') {
showMessage('Необходимо войти в систему');
}
});
В этом примере объект состояния
{ reason: 'not_authenticated' } передается из
/form в /login, что позволяет обработчику
маршрута показать соответствующее сообщение.
document.querySelector('#logoutBtn').addEventListener('click', () => {
logoutUser();
page.redirect('/login');
});
page('/admin', ctx => {
if (!ctx.user.isAdmin) {
page.redirect('/403'); // Страница "Доступ запрещён"
}
});
page('/checkout', ctx => {
if (!ctx.cart.items.length) {
page.redirect('/shop', { emptyCart: true });
}
});
Метод page.redirect() создает новую запись в
истории браузера, что позволяет пользователю использовать
кнопку «Назад». В отличие от location.replace(),
page.redirect() корректно обрабатывается библиотекой
Page.js и не вызывает перезагрузку страницы.
Если требуется заменить текущую запись истории вместо создания новой,
используется метод page.replace(path, [state]). Он работает
аналогично page.redirect(), но текущая запись URL в истории
заменяется новым.
page.redirect() для перенаправления внутри
приложения без полной перезагрузки страницы.state важные данные, чтобы не хранить
их в query-параметрах.page.show() и
page.replace() при работе с историей браузера.page('/profile', ctx => {
if (!ctx.user) {
page.redirect('/login', { from: '/profile' });
return;
}
renderProfile(ctx.user);
});
page('/login', ctx => {
renderLoginForm();
if (ctx.state.from) {
showMessage(`Сначала войдите для доступа к ${ctx.state.from}`);
}
});
В этом примере реализован полный цикл:
/profile./login с передачей исходного
маршрута.Метод page.redirect() является ключевым инструментом для
управления навигацией в SPA на Page.js, обеспечивая
гибкую маршрутизацию, передачу состояния и контроль доступа к различным
частям приложения.