В Universal Router маршруты можно настраивать таким образом, чтобы принимать несколько значений одного параметра, объединяя их в массив. Это особенно полезно при работе с фильтрами, тегами, категориями или любыми множественными параметрами в URL.
Для того чтобы маршрут распознавал несколько значений, в шаблоне пути
используется двойная двоеточие или символы расширенного
синтаксиса. На практике чаще применяют формат param+,
который обозначает массив:
import UniversalRouter from 'universal-router';
const routes = [
{
path: '/tags/:tags+',
action: ({ params }) => {
return params.tags; // массив тегов
}
}
];
const router = new UniversalRouter(routes);
(async () => {
const result = await router.resolve('/tags/javascript/nodejs/vue');
console.log(result); // ['javascript', 'nodejs', 'vue']
})();
Разбор примера:
:tags+ — ключевой момент: знак + указывает
на множественные сегменты.params.tags Universal Router автоматически собирает
все сегменты пути в массив.Если требуется более строгий контроль над форматом значений, можно использовать регулярные выражения в описании маршрута:
const routes = [
{
path: '/items/:ids(\\d+(?:,\\d+)*)',
action: ({ params }) => {
return params.ids.split(',').map(Number); // массив чисел
}
}
];
const router = new UniversalRouter(routes);
(async () => {
const result = await router.resolve('/items/12,45,78');
console.log(result); // [12, 45, 78]
})();
Особенности подхода:
\\d+(?:,\\d+)* позволяет принимать
строку чисел, разделённых запятыми.action требуется дополнительная обработка
(split и map), чтобы получить массив.Помимо сегментов пути, Universal Router поддерживает параметры query, которые могут быть массивами:
const routes = [
{
path: '/search',
action: ({ query }) => {
return query.tags; // массив ['js', 'vue', 'react']
}
}
];
const router = new UniversalRouter(routes);
(async () => {
const result = await router.resolve({ pathname: '/search', query: { tags: ['js', 'vue', 'react'] } });
console.log(result); // ['js', 'vue', 'react']
})();
query.tags уже представляет собой массив без
дополнительных преобразований.Иногда требуется сделать массив параметров
необязательным. В Universal Router это реализуется
через *:
const routes = [
{
path: '/categories/:categories*',
action: ({ params }) => {
return params.categories || []; // если параметр отсутствует, вернется пустой массив
}
}
];
const router = new UniversalRouter(routes);
(async () => {
console.log(await router.resolve('/categories')); // []
console.log(await router.resolve('/categories/tech/science')); // ['tech', 'science']
})();
:categories* — символ * означает 0
или более сегментов.Universal Router позволяет смешивать массивы и одиночные параметры в одном маршруте:
const routes = [
{
path: '/user/:id/photos/:photoIds+',
action: ({ params }) => {
return {
userId: params.id,
photos: params.photoIds
};
}
}
];
const router = new UniversalRouter(routes);
(async () => {
const result = await router.resolve('/user/42/photos/1/2/3');
console.log(result); // { userId: '42', photos: ['1','2','3'] }
})();
:id остаётся одиночным параметром, а
:photoIds+ собирает все последующие сегменты в массив.+ для обязательных
массивов, * для необязательных.+/*.Работа с массивами параметров делает маршрутизацию гибкой, читаемой и масштабируемой, особенно при проектировании приложений с динамическими фильтрами, множественными тегами или вложенными ресурсами.