Где хранится состояние компонента?
Компоненты
Состояние компонента хранится не в самом компоненте, а внутри React — на fiber-узле, соответствующем этому компоненту в дереве.
Механика
Функция компонента выполняется и «умирает» на каждом рендере — её локальные переменные не переживают вызов. Состояние живёт дольше, потому что React хранит его у себя:
- у каждого смонтированного компонента есть fiber — внутренний объект React;
- хуки состояния (useState/useReducer/useRef) — ячейки связного списка на fiber'е;
- при рендере каждый вызов useState по порядку читает свою ячейку и возвращает актуальное значение (аргумент-инициализатор после первого рендера игнорируется).
const Counter = () => {
const [count, setCount] = useState(0);
// count — копия значения из ячейки fiber'а на момент этого рендера
};Именно поэтому хуки нельзя вызывать условно: соответствие «вызов ↔ ячейка» держится на порядке.
Следствия
- Состояние привязано к позиции в дереве: тот же компонент в том же месте сохраняет state между рендерами; смена позиции, типа или key — размонтирование и потеря состояния (смена key — намеренный способ сброса).
- Экземпляры независимы: два
<Counter />— два fiber'а, два независимых состояния. - Размонтирование стирает state — навсегда; нужно пережить размонтирование — поднимайте состояние выше, в стор или во внешнее хранилище (localStorage).
- В классах то же самое, но ячейка одна — this.state на инстансе, связанном с fiber.
Коротко для собеседования
Состояние живёт внутри React — в списке хуков на fiber-узле компонента, а не в переменных функции (они пересоздаются каждый рендер). Отсюда: сопоставление по порядку вызова хуков, привязка state к позиции в дереве (key/тип меняются — state сбрасывается), независимость экземпляров и потеря состояния при размонтировании.