Riot.js предоставляет собственный лёгкий роутер Riot Route, который позволяет управлять состоянием приложения в зависимости от URL, без необходимости подключать сторонние библиотеки. Riot Route обеспечивает простую маршрутизацию для одностраничных приложений (SPA) и интегрируется с компонентами Riot.js естественным образом.
Riot Route работает через отслеживание изменения хэша в URL или истории браузера. Основная концепция — связывать определённый путь с функцией или компонентом, который должен отображаться при совпадении маршрута.
Riot Route включён в основной пакет Riot.js и подключается через
глобальный объект route:
import { route } from 'riot';
Для начала работы достаточно инициализировать маршруты и вызвать
route.start(true) для запуска маршрутизации с учётом
текущего URL.
Маршруты определяются с помощью метода route().
Синтаксис простой:
route('/path', callback)
/path — строка пути, может включать
параметры.callback — функция, вызываемая при
совпадении маршрута.Пример:
route('/home', () => {
console.log('Главная страница');
});
route('/about', () => {
console.log('О приложении');
});
Riot Route поддерживает динамические сегменты в пути, которые
начинаются с двоеточия ::
route('/user/:id', (id) => {
console.log(`Пользователь с ID: ${id}`);
});
Можно использовать несколько параметров:
route('/order/:orderId/item/:itemId', (orderId, itemId) => {
console.log(`Заказ ${orderId}, товар ${itemId}`);
});
Если нужно получить необязательные параметры или использовать регулярные выражения, их можно передавать прямо в путь:
route('/page/*', (path) => {
console.log(`Любая страница: ${path}`);
});
Для программной навигации используется метод route с
указанием пути:
route('/home'); // переход на /home
При необходимости можно заменить текущую запись в истории браузера вместо добавления новой:
route('/about', true); // true — заменить текущую запись
По умолчанию Riot Route работает через hash-based
routing (используется # в URL). Для поддержки
истории HTML5 необходимо включить соответствующую настройку:
route.start(true); // true — использовать pushState
Это позволяет получать чистые URL без символа # и
улучшает SEO и читаемость ссылок.
Riot Route предоставляет события для отслеживания изменений маршрутов:
route.start — вызывается при запуске роутера.route.changed — при изменении маршрута.route.exit — перед выходом с маршрута.Пример:
route.start(true);
route('/profile/:id', (id) => {
console.log(`Открыт профиль: ${id}`);
});
route.changed((newRoute) => {
console.log('Маршрут изменён:', newRoute);
});
Маршруты обычно связываются с монтированием или обновлением компонентов:
import Profile from './components/profile.riot';
route('/profile/:id', (id) => {
const container = document.getElementById('app');
container.innerHTML = '';
mount(Profile, { userId: id }, container);
});
Это позволяет динамически отображать нужный компонент в зависимости от текущего URL.
Riot Route поддерживает вложенные маршруты и может использоваться для организации сложной навигации:
route('/admin/*', (subPath) => {
if (subPath === 'dashboard') {
console.log('Админская панель');
} else if (subPath.startsWith('users')) {
console.log('Секция пользователей');
}
});
Также можно использовать регулярные выражения для обработки сложных шаблонов маршрутов:
route(/^\/product\/(\d+)$/, (id) => {
console.log(`Товар с ID: ${id}`);
});
Маршруты можно отключать при необходимости с помощью метода
route.stop() для глобальной остановки или
route('*', null) для конкретного пути.
route.stop(); // останавливает обработку всех маршрутов
Riot Route представляет собой компактное и мощное решение для маршрутизации в SPA на Riot.js, сочетая простоту использования с возможностью гибкой настройки под любые требования приложения.