Выбор ответа Middle Паттерны компонентов обновлено

Как compound-компоненты делят состояние

Вопрос

В API <Tabs><Tabs.Tab value="a" /><Tabs.Panel value="a" /></Tabs> как Tabs.Tab узнаёт, какая вкладка активна, если пользователь может вкладывать вкладки в любые обёртки?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Tabs хранит активное значение и отдаёт его через Context. Context доставляет значение на любую глубину, поэтому пользователь свободен в разметке.

Варианты ответа

  1. Tabs перебирает children через React.Children.map и клонирует с active
  2. Tabs хранит активное значение и отдаёт его через Contextправильный ответ
  3. Каждая вкладка хранит своё состояние и синхронизирует его через useEffect
  4. Через переменную модуля, которую Tabs обновляет при клике

Разбор

Context доставляет значение на любую глубину, поэтому пользователь свободен в разметке. Так сделаны Radix, Headless UI и другие библиотеки.

  • Children.map и cloneElement видят только прямых детей: стоит обернуть Tab в div, и пропс не дойдёт. Подход хрупкий и устаревший.
  • Синхронизация через эффекты даёт лишние рендеры и рассинхрон.
  • Глобальная переменная сломается при двух Tabs на странице.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.