PassFront
  1. PassFront
  2. База знаний
  3. Хуки

Изменится ли переменная из UseState при перерендеринге?

Хуки

При перерендеринге вызов useState вернёт актуальное значение из хранилища React — но внутри одного рендера переменная никогда не меняется: это константа-«снимок».

Две точки зрения

Между рендерами — да, «изменится». React хранит состояние на fiber-узле; каждый новый вызов компонента получает свежее значение:

const Counter = () => {
  const [count, setCount] = useState(0);
  // 1-й рендер: count === 0
  // после setCount(1) и ререндера: count === 1 (новая переменная нового вызова)
};

Инициализатор useState(0) при повторных рендерах игнорируется — возвращается сохранённое значение, а не 0.

Внутри одного рендера — нет, не изменится. count — обычная const в замыкании данного вызова функции:

const handleClick = () => {
  setCount(count + 1);
  console.log(count);      // старое значение! переменная не мутируется
  setCount(count + 1);     // видит тот же старый count → итог +1, не +2
};

Правильно для серий обновлений — функциональная форма: setCount((c) => c + 1).

Модель «снимков»

Каждый рендер — это отдельный вызов функции со своими props, state и замыканиями. Обработчики и эффекты, созданные в этом рендере, «фотографируют» его значения. setState не мутирует переменную — он просит React выполнить новый рендер, в котором useState вернёт новое значение.

Коротко для собеседования

Да — при следующем рендере useState вернёт обновлённое значение (инициализатор игнорируется). Но внутри текущего рендера переменная — неизменяемый снимок: после setState она не меняется, поэтому серии обновлений делают через функциональную форму сеттера. Каждый рендер — свой набор значений и замыканий.

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