ResolveContext является одной из ключевых сущностей при
работе с библиотекой Universal Router в JavaScript. Он
представляет собой объект, который передаётся каждому маршруту при
попытке его разрешения и предоставляет полный контекст выполнения
маршрута, включая параметры, путь, родительские маршруты и возможности
для асинхронного управления переходом.
ResolveContextpathСвойство path хранит текущий путь запроса. Оно
представляет собой строку и обычно используется для сопоставления с
маршрутами. Например:
const context = {
path: '/users/42'
};
С помощью path можно создавать динамические маршруты и
выполнять их проверку относительно текущего запроса.
baseUrlbaseUrl указывает базовый URL для вложенных маршрутов.
Этот параметр особенно полезен при организации сложной иерархии
маршрутов, когда один маршрут выступает контейнером для нескольких
дочерних:
{
path: '/admin',
children: [
{
path: 'dashboard',
action: ({ baseUrl }) => console.log(baseUrl) // "/admin"
}
]
}
Использование baseUrl позволяет корректно строить
относительные пути для дочерних маршрутов без необходимости дублировать
базовую часть URL.
routerСвойство router содержит экземпляр самого
Universal Router, что позволяет из любого места
контекста выполнять вызовы router.resolve для динамического
перехода между маршрутами. Пример использования:
action: async ({ router }) => {
const result = await router.resolve('/profile');
return result;
}
Это свойство обеспечивает полную интеграцию маршрутизатора в асинхронные цепочки вызовов и поддерживает вложенные маршруты.
parentparent хранит ссылку на родительский маршрут в текущем
контексте. Это свойство удобно использовать для передачи состояния между
уровнями маршрутов или доступа к данным родительского маршрута:
{
path: '/users/:id',
action: ({ parent }) => {
console.log(parent && parent.name); // Имя родительского маршрута, если существует
}
}
Использование parent упрощает построение иерархических
маршрутов и управление состоянием на нескольких уровнях.
routeСвойство route содержит объект маршрута, который в
данный момент обрабатывается. Оно включает все определённые в маршруте
поля: path, action, children,
name и любые дополнительные параметры:
action: ({ route }) => {
console.log(route.path); // "/users/:id"
}
route обеспечивает доступ к конфигурации маршрута на
этапе его выполнения, что позволяет динамически изменять поведение
маршрута или выполнять условные проверки.
paramsparams — объект, содержащий параметры текущего маршрута,
извлечённые из пути. Для динамических сегментов URL, таких как
/users/:id, свойство params автоматически
заполняется:
action: ({ params }) => {
console.log(params.id); // "42" при пути "/users/42"
}
Эти параметры можно использовать для загрузки данных, отображения информации или формирования ссылок на основе динамических сегментов.
context и dataДополнительно можно использовать свойства context и
data для передачи пользовательских данных между маршрутами.
В Universal Router объект context часто
расширяется для передачи глобального состояния или сервисов, таких как
API-клиенты или хранилища:
const context = {
apiClient: new ApiClient(),
user: { id: 1, name: 'Alice' }
};
const router = new UniversalRouter(routes, { context });
Внутри action маршрута эти данные доступны через
аргумент контекста:
action: ({ apiClient, user }) => {
return apiClient.getUserData(user.id);
}
ResolveContextХотя ResolveContext является объектом с данными, он
тесно интегрирован с методом router.resolve. Этот метод
принимает путь или маршрут и контекст, возвращая результат работы
маршрута:
const result = await router.resolve('/users/42', context);
В процессе разрешения маршрута объект ResolveContext
последовательно передаётся дочерним маршрутам, что обеспечивает доступ к
базовому URL, параметрам, родителям и самому маршрутизатору.
ResolveContext в динамических маршрутахОдним из наиболее мощных сценариев применения
ResolveContext является создание динамических маршрутов,
где путь, параметры и контекст определяют, какие данные загружать и
какие действия выполнять:
{
path: '/posts/:postId',
async action({ params, router, route }) {
const post = await fetchPost(params.postId);
if (!post) return router.resolve('/404');
return {
title: post.title,
content: post.body
};
}
}
Здесь params извлекает динамический сегмент
postId, router позволяет перенаправить на
страницу ошибки при отсутствии поста, а route предоставляет
доступ к конфигурации текущего маршрута.
action.params,
route, parent и router
обеспечивают полное управление логикой маршрутизации и интеграцией с
приложением.ResolveContext в Universal Router
является мощным инструментом для построения сложных маршрутов с
динамическими параметрами, вложенной структурой и асинхронной логикой,
предоставляя разработчику полный контроль над обработкой каждого
запроса.