Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про JavaScript: React, useState, state update, functional update, multiple additions

testMP множественное добавление - вопрос 2

Вопрос проверяет понимание механизма множественного добавления элементов в React с использованием хука useState, чтобы избежать ошибок при асинхронных обновлениях состояния.

Короткий ответ

В React обновления состояния через useState асинхронны, поэтому прямое изменение состояния несколько раз в одном событии может не сработать, так как каждое обновление использует старое значение. Чтобы добавить несколько элементов, нужно использовать функциональную форму setState, которая принимает предыдущее состояние и возвращает новое. Это гарантирует, что каждое обновление основывается на актуальном состоянии, и все элементы будут добавлены корректно.

Длинный ответ

В React хук useState позволяет управлять состоянием компонента, но важно понимать, что обновления состояния не происходят синхронно. Когда вы вызываете функцию обновления состояния (например, setItems) несколько раз подряд в одном синхронном блоке кода (например, в обработчике события), React может объединить эти обновления, и каждое из них будет использовать одно и то же старое значение состояния. Это приводит к тому, что только последнее обновление применяется, а предыдущие "теряются".

Проблема множественного добавления

Представьте, что у вас есть список элементов, и вы хотите добавить несколько новых элементов при нажатии кнопки. Если вы сделаете это через прямое обновление, код может выглядеть так:

const [items, setItems] = useState([]);
const handleAdd = () => {
  setItems([...items, 'item1']);
  setItems([...items, 'item2']); // Ошибка: items здесь всё ещё старый массив
};

В этом примере оба вызова setItems используют начальное значение items (пустой массив), потому что React ещё не обновил состояние после первого вызова. В результате в состоянии окажется только ['item2'], а 'item1' будет потерян.

Решение: функциональное обновление

Чтобы решить эту проблему, нужно использовать функциональную форму setItems, которая принимает предыдущее состояние в качестве аргумента и возвращает новое состояние. Это гарантирует, что каждое обновление основывается на самом актуальном состоянии:

const handleAdd = () => {
  setItems(prevItems => [...prevItems, 'item1']);
  setItems(prevItems => [...prevItems, 'item2']);
};

Теперь первый вызов добавит 'item1' к текущему массиву, а второй вызов возьмёт уже обновлённый массив (с 'item1') и добавит 'item2'. В итоге состояние станет ['item1', 'item2'].

Практическое применение

Этот подход полезен в сценариях, где состояние обновляется несколько раз в быстрой последовательности, например:

  • Добавление нескольких элементов из списка данных.
  • Обработка пакетных операций в UI (например, загрузка файлов).
  • Работа с асинхронными событиями, которые могут триггерить обновления.

Использование функциональных обновлений делает код более предсказуемым и избегает распространённых ошибок, связанных с асинхронностью React.

Вывод: Функциональные обновления состояния в React следует применять, когда нужно выполнить несколько последовательных изменений состояния в одном событии, чтобы гарантировать корректность и избежать потери данных.

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    4

  • Сложность:

    3

Навыки

  • JavaScript

    JavaScript

  • React

    React

Ключевые слова

#React

#useState

#state update

#functional update

#multiple additions

Подпишись на Golang Developer в телеграм

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.