Видеоуроки, интерактивный редактор и сохранение прогресса — бесплатно, сразу после входа.
ВойтиСоздать аккаунт — бесплатноЗакончили урок?
Войдите, чтобы отмечать прогресс
В этом решении тема и пользователь вынесены в два контекста: создаются ThemeContext и UserContext, в App дерево оборачивается в два вложенных провайдера, а ThemeBadge и UserBadge читают данные только из своих контекстов.
Один контекст отвечает за тему (значение и функцию переключения), второй — за объект пользователя. Компоненты подписываются только на то, что им нужно: бейдж темы не знает про пользователя, бейдж пользователя — про тему.
Компонент получает theme и setTheme из ThemeContext, отображает текущую тему и кнопку переключения. Пропсы не нужны.
Достаёт объект user из UserContext и выводит имя. Ни тема, ни другие данные сюда не передаются.
Состояние темы и объект пользователя по-прежнему в App. Значение для темы обёрнуто в useMemo с зависимостью [theme], чтобы ссылка на объект не менялась без смены темы. Снаружи — провайдер темы, внутри — провайдер пользователя; в шапке рендерятся ThemeBadge и UserBadge. Каждый бейдж подписан только на свой контекст.