Когда стоит хранить состояние внутри дочернего компонента вместо родителя с учетом бизнес-логики
Что проверяют
Понимаете ли вы, что место для состояния определяется тем, кто его читает и кто на его основе принимает решения, а не удобством. Следом обычно спрашивают: что делать, если через месяц это же значение понадобится соседнему компоненту, и как не превратить родителя в свалку useState.
Как отвечать
Базовое правило: состояние живёт в ближайшем общем предке всех компонентов, которые его читают, и не выше. Дальше разложите по типам:
- локальное состояние интерфейса: раскрыт ли аккордеон, открыт ли выпадающий список, текст в поле до отправки, развёрнута ли строка таблицы. Держите его в дочернем компоненте, родителю оно не нужно;
- состояние, от которого зависит бизнес-решение: выбранный тариф, состав корзины, фильтры, которые уходят в запрос. Его поднимают туда, где решение принимается, или выносят в стор (Zustand, Redux Toolkit) либо в URL, если им нужно делиться ссылкой;
- данные с сервера: это не состояние компонента, а кеш. Для него есть TanStack Query или SWR;
- производные значения: итоговую сумму или признак «форма валидна» не храните отдельно, считайте при рендере.
Отдельно скажите про производительность. Смена состояния в родителе перерисовывает всё его поддерево, поэтому раскрытие одной строки из тысячи, поднятое наверх, заставит React пройти по всей таблице. Локальное состояние обновляет только строку.
Хороший приём для переиспользуемых компонентов: поддержать оба режима, неконтролируемый с defaultValue и контролируемый с value и onChange. Сбросить внутреннее состояние ребёнка можно сменой key, без эффектов.
Где спотыкаются
Копируют проп в useState ребёнка и синхронизируют через useEffect. Получаются два источника правды, которые расходятся при первом же обновлении.
Поднимают всё в глобальный стор «на всякий случай». Каждое нажатие клавиши в поле перерисовывает половину страницы, а код формы размазан по трём файлам.
Прячут бизнес-значимое значение в ребёнке, а потом достают его через ref или колбэк из эффекта. Если родителю нужно знать значение для отправки или расчёта, это сигнал поднять состояние, а не строить обходной путь.