Интерфейс ResolveContext

ResolveContext является одной из ключевых сущностей при работе с библиотекой Universal Router в JavaScript. Он представляет собой объект, который передаётся каждому маршруту при попытке его разрешения и предоставляет полный контекст выполнения маршрута, включая параметры, путь, родительские маршруты и возможности для асинхронного управления переходом.


Основные свойства ResolveContext

path

Свойство path хранит текущий путь запроса. Оно представляет собой строку и обычно используется для сопоставления с маршрутами. Например:

const context = {
  path: '/users/42'
};

С помощью path можно создавать динамические маршруты и выполнять их проверку относительно текущего запроса.


baseUrl

baseUrl указывает базовый 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;
}

Это свойство обеспечивает полную интеграцию маршрутизатора в асинхронные цепочки вызовов и поддерживает вложенные маршруты.


parent

parent хранит ссылку на родительский маршрут в текущем контексте. Это свойство удобно использовать для передачи состояния между уровнями маршрутов или доступа к данным родительского маршрута:

{
  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 обеспечивает доступ к конфигурации маршрута на этапе его выполнения, что позволяет динамически изменять поведение маршрута или выполнять условные проверки.


params

params — объект, содержащий параметры текущего маршрута, извлечённые из пути. Для динамических сегментов 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.
  • Наследование: Дочерние маршруты получают расширенный контекст с базовым URL и родительскими ссылками.
  • Гибкость: Свойства params, route, parent и router обеспечивают полное управление логикой маршрутизации и интеграцией с приложением.

ResolveContext в Universal Router является мощным инструментом для построения сложных маршрутов с динамическими параметрами, вложенной структурой и асинхронной логикой, предоставляя разработчику полный контроль над обработкой каждого запроса.