Динамические сегменты в Universal Router позволяют
создавать маршруты, параметры которых определяются во время навигации.
Это ключевой инструмент для построения маршрутизации с переменными
частями URL, например, /users/:id или
/posts/:category/:postId.
Динамический сегмент обозначается двоеточием : перед
именем параметра:
import UniversalRouter from 'universal-router';
const routes = [
{
path: '/users/:id',
action: ({ params }) => {
return `User ID: ${params.id}`;
}
}
];
const router = new UniversalRouter(routes);
router.resolve('/users/42').then(console.log); // User ID: 42
Здесь :id — динамический сегмент. При переходе на
/users/42 объект params автоматически получает
{ id: '42' }.
Ключевой момент: имя сегмента после :
используется как ключ в объекте params.
Можно определять несколько сегментов в одном маршруте:
{
path: '/posts/:category/:postId',
action: ({ params }) => {
return `Category: ${params.category}, Post: ${params.postId}`;
}
}
При обращении к /posts/javascript/101 объект
params будет таким:
{
category: 'javascript',
postId: '101'
}
Это позволяет строить маршруты с произвольной вложенностью и использовать параметры для загрузки данных или формирования интерфейса.
Необязательные сегменты обозначаются с помощью знака
?:
{
path: '/archive/:year/:month?',
action: ({ params }) => {
return params.month
? `Archive for ${params.year}/${params.month}`
: `Archive for ${params.year}`;
}
}
URL /archive/2026 вернёт
{ year: '2026', month: undefined }, а
/archive/2026/03 вернёт
{ year: '2026', month: '03' }.
Совет: необязательные сегменты удобно использовать для фильтров и пагинации, когда часть данных может отсутствовать.
Можно задать регулярные выражения для сегментов, чтобы ограничить допустимые значения:
{
path: '/products/:id(\\d+)',
action: ({ params }) => {
return `Product ID: ${params.id}`;
}
}
В этом примере :id примет только числовые значения. URL
/products/abc не будет соответствовать маршруту, а
/products/123 успешно разрешится.
Динамические сегменты прекрасно работают с вложенными маршрутами:
const routes = [
{
path: '/users/:userId',
children: [
{
path: 'settings',
action: ({ params }) => `Settings for user ${params.userId}`
},
{
path: 'profile',
action: ({ params }) => `Profile of user ${params.userId}`
}
]
}
];
Переход на /users/5/settings вернёт
Settings for user 5. Объект params передаётся
во все дочерние маршруты.
Важно: дочерние маршруты наследуют параметры родительского маршрута.
Universal Router не обрабатывает query-параметры напрямую. Их можно
получить через объект location.search при интеграции с
window.location или сторонними библиотеками парсинга
URL:
const url = '/users/42?active=true';
const queryParams = new URLSearchParams(url.split('?')[1]);
console.log(queryParams.get('active')); // true
Динамические сегменты работают только с частью пути до
?, query-параметры обрабатываются отдельно.
/users/:id для
отображения профиля конкретного пользователя./blog/:year/:month/:slug для отображения статьи по дате и
уникальному идентификатору./products/:category/:subcategory? для динамических
каталогов.Динамические сегменты позволяют создавать гибкую маршрутизацию, не создавая сотни статических маршрутов для каждой возможной комбинации URL.
Динамические сегменты — это фундаментальная возможность Universal Router, обеспечивающая масштабируемую и управляемую маршрутизацию для современных SPA и серверных приложений на JavaScript.