Могли ли функциональные компоненты иметь состояние до появления хуков в React
Что проверяют
Знаете ли вы, зачем вообще появились хуки, и понимаете ли, как React связывает состояние с компонентом. Вопрос с виду исторический, но настоящая цель дальше: следом спрашивают, почему хуки нельзя вызывать внутри условия и как React понимает, какому вызову useState какое значение вернуть.
Как отвечать
Короткий ответ: своего состояния у функциональных компонентов не было. this.state и setState существовали только у классов, поэтому функции называли презентационными: они получали props и рисовали разметку.
Дальше расскажите, как состояние в них всё-таки попадало:
- классовая обёртка: умный класс держал состояние и передавал его вниз через
props. Разделение на контейнеры и презентационные компоненты выросло именно отсюда; - HOC: компонент высшего порядка вроде
withStateизrecomposeоборачивал функцию классом и подмешивал состояние вprops. По этому же принципу работалconnectиз Redux; - render props: компонент с состоянием принимал функцию рендера и отдавал ей своё состояние аргументом.
Отдельно объясните, почему замыкание или переменная модуля не считаются решением: React про такое изменение не знает и перерисовку не запустит, а значение окажется общим для всех экземпляров компонента. forceUpdate тоже был только у классов.
Хуки приехали в React 16.8 в феврале 2019 года. useState работает потому, что React хранит хуки списком на узле дерева и опирается на порядок вызовов, а не на имена переменных. Отсюда и правило: только верхний уровень, без условий и циклов. Классы поддерживаются до сих пор, но новые возможности (серверные компоненты, use, useActionState) сделаны только для функций.
Где спотыкаются
Отвечают «да, можно было через замыкание». Сохранить значение получится, но перерисовки не будет, а без неё это не состояние.
Не могут назвать ни HOC, ни render props, хотя вопрос ведёт ровно туда.
Объясняют работу useState через имена переменных или порядок строк в файле. React считает порядок вызовов при рендере, поэтому условный хук ломает соответствие.