20.05.2025, Ссылка на статью

Автор пишет о проблемах React.Context и возможных вариантах решения сейчас и в будущем. Основное назначение контекста в Реакте – управление состоянием, которое хорошо работает. Частое использование контекстов приводит к provider hell, который можно решить при помощи композиции:

const CombinedProviders = (props) => {
  const providers = [
    [Provider1, { value: props.value1 }],
    [Provider2, { value: props.value2 }],
    [Provider3, { value: props.value3 }],
  ];
  return providers.reduceRight(
    (children, [Provider, value]) =>
      <Provider {...value}>{children}</Provider>,
    props.children
  );
};

Однако композиция не решает проблем с динамическим состоянием, которое может ререндерить всё поддерево.

Следующим шагом к оптимизации является использование useContextSelector из одноименного пакета и useSyncExternalStore из самого Реакта. Хук useSyncExternalStore является очень полезным, если необходимо синхронизировать внешнее состояние, но он всё ещё имеет проблемы с параллельным рендерингом. Ну а для решения проблемы с параллельным рендерингом в React Labs анонсировали улучшение хука use(store), которое, возможно, позволит перейти к варианту использования внешних сторов, а не контекстов.