Route — это базовый строительный блок маршрутизации в
библиотеке Universal Router. Он определяет соответствие
между URL и обработчиком, который будет выполнен при совпадении. В
основе работы лежит сопоставление путей с
шаблонами маршрутов и последующее выполнение связанных
функций.
Объект Route имеет несколько ключевых свойств, которые
позволяют гибко управлять маршрутизацией:
path — строка или массив строк,
задающий шаблон URL, по которому будет происходить совпадение.
Поддерживаются параметры и регулярные выражения.
{
path: '/users/:id',
action: ({ params }) => `Пользователь с ID ${params.id}`
}action — функция, которая
выполняется при совпадении маршрута. Получает объект с контекстом и
параметрами.
children — массив вложенных
маршрутов, используемых для создания иерархической структуры
маршрутизации. Позволяет строить вложенные интерфейсы и поддерживать
вложенные URL.
name — строка, уникальное имя
маршрута. Используется для генерации URL и упрощённой навигации через
ссылки на маршрут по имени.
redirect — строка или функция,
определяющая, куда перенаправить пользователя при совпадении
маршрута.
exact — булевый флаг, который
указывает, должно ли совпадение быть полным (true) или
частичным (false).
match — функция, которая позволяет
вручную определять логику сопоставления URL с маршрутом. Используется
для более сложных случаев, когда стандартного шаблона
недостаточно.
path поддерживает динамические сегменты, что позволяет
создавать универсальные маршруты:
Параметры URL: сегменты вида :param
автоматически извлекаются и передаются в объект params.
{
path: '/posts/:postId/comments/:commentId',
action: ({ params }) => `Комментарий ${params.commentId} к посту ${params.postId}`
}Регулярные выражения: можно ограничить значения
параметров, используя синтаксис :param(\\d+) для числовых
значений.
{
path: '/products/:id(\\d+)',
action: ({ params }) => `Продукт ${params.id}`
}Необязательные сегменты: добавляются с помощью
символа ?.
{
path: '/archive/:year/:month?',
action: ({ params }) => `Архив за ${params.year} ${params.month || ''}`
}Использование children позволяет создавать
многоуровневую маршрутизацию. Родительский маршрут может обрабатывать
общий контекст, а дочерние маршруты — детализированные действия:
{
path: '/dashboard',
action: () => 'Главная панель',
children: [
{
path: 'settings',
action: () => 'Настройки пользователя'
},
{
path: 'profile',
action: () => 'Профиль пользователя'
}
]
}
В данном примере /dashboard/settings и
/dashboard/profile наследуют контекст родительского
маршрута и выполняют свои действия.
Функция action получает объект контекста, который
содержит:
params — объект с параметрами
маршрута.pathname — текущий URL.query — объект с GET-параметрами (если
используется парсер query).route — сам маршрут, который
сработал.router — экземпляр Universal Router
для программного управления навигацией.Пример использования контекста:
{
path: '/users/:id',
action: ({ params, router }) => {
if (params.id === 'admin') {
return router.resolve('/admin');
}
return `Пользователь: ${params.id}`;
}
}
Свойство redirect позволяет автоматически перенаправлять
пользователя при совпадении маршрута. Значение может быть строкой или
функцией, возвращающей URL:
{
path: '/old-path',
redirect: '/new-path'
}
{
path: '/profile',
redirect: ({ params }) => (params.id === 'guest' ? '/login' : '/dashboard')
}
Функция match позволяет создавать условные маршруты на
уровне сопоставления, возвращая false, если маршрут не
должен сработать:
{
path: '/secret',
match: ({ isAuthenticated }) => isAuthenticated,
action: () => 'Секретная страница'
}
exact: true предотвращает случайные
частичные совпадения.name упрощают генерацию ссылок и
навигацию.const routes = [
{
path: '/',
name: 'home',
action: () => 'Главная страница'
},
{
path: '/users',
children: [
{
path: ':id(\\d+)',
name: 'user',
action: ({ params }) => `Пользователь ${params.id}`
},
{
path: 'new',
action: () => 'Создание пользователя'
}
]
},
{
path: '/login',
action: () => 'Форма входа'
},
{
path: '/old-dashboard',
redirect: '/dashboard'
}
];
В этом примере реализованы динамические параметры, вложенные
маршруты, редиректы и именованные маршруты. Такая структура полностью
демонстрирует потенциал интерфейса Route в
Universal Router, позволяя строить гибкие и
масштабируемые системы маршрутизации.