← Назад к вопросам

Зачем нужна функция в качестве аргумента в setState?

2.0 Middle🔥 161 комментариев
#State Management

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Зачем нужна функция в качестве аргумента в setState?

В React класс-компонентах метод setState() может принимать второй аргумент — callback-функцию, которая выполняется после того, как состояние обновлено и компонент перерендерился. Это критически важная функция, потому что состояние обновляется асинхронно.

Асинхронная природа setState

В React setState() работает не мгновенно. React батчирует обновления для оптимизации производительности:

this.setState({ count: this.state.count + 1 });
console.log(this.state.count); // Выведет старое значение!

Если вы попытаетесь использовать обновлённое состояние сразу после setState(), получите старое значение, потому что обновление ещё не завершилось.

Решение: callback в setState

Чтобы гарантированно работать с актуальным состоянием, передайте callback вторым аргументом:

this.setState({ count: this.state.count + 1 }, () => {
  console.log(this.state.count); // Выведет новое значение!
  // Состояние гарантированно обновлено
});

Callback выполняется после:

  1. Обновления состояния
  2. Перерендера компонента
  3. DOM-обновлений

Практические примеры использования

Пример 1: Работа с DOM после обновления

this.setState({ isOpen: true }, () => {
  // Теперь можно безопасно работать с DOM-элементом
  this.inputRef.current.focus();
});

Пример 2: Отправка данных на сервер с актуальным состоянием

this.setState({ userData: newData }, () => {
  // Гарантированно отправляем обновлённые данные
  this.sendToServer(this.state.userData);
});

Пример 3: Логирование

this.setState({ loading: false }, () => {
  console.log("Загрузка завершена, текущее состояние:", this.state);
});

В современном React (Hooks)

В функциональных компонентах с useState нет встроенного callback. Вместо этого используется useEffect:

const [count, setCount] = useState(0);

useEffect(() => {
  // Код здесь выполняется ПОСЛЕ обновления состояния и перерендера
  console.log("Состояние обновлено:", count);
}, [count]); // Зависимость от count

Ключевые различия

АспектsetState callbackuseEffect
Класс-компоненты✅ Встроено-
Функциональные компоненты❌ Нет✅ Используй это
Гарантия выполненияПосле обновленияПосле рендера
СинтаксисsetState({}, callback)useEffect(() => {}, [deps])

Почему это важно

Без callback:

this.setState({ user: data });
this.fetchRelated(this.state.user); // Может использовать старые данные!

С callback:

this.setState({ user: data }, () => {
  this.fetchRelated(this.state.user); // Гарантированно новые данные
});

Эта механика критична для правильной работы приложения и предотвращения багов, связанных с асинхронностью обновлений состояния.

Зачем нужна функция в качестве аргумента в setState? | PrepBro