PassFront
  1. PassFront
  2. База знаний
  3. Компоненты

Где хранится состояние компонента?

Компоненты

Состояние компонента хранится не в самом компоненте, а внутри 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 сбрасывается), независимость экземпляров и потеря состояния при размонтировании.

Другие вопросы раздела