Обновление вложенных свойств состояния в React: setState

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Чтобы обновить изменяемые объекты в React, эффективно применяйте синтаксис расширения (...).

JS
Скопировать код
this.state = {
  user: { name: "Алиса", details: { age: 30 } }
};

Когда нужно увеличить возраст, не затрагивая остальные данные:

JS
Скопировать код
this.setState(prevState => ({
  user: {
    ...prevState.user,
    details: { ...prevState.user.details, age: prevState.user.details.age + 1 } 
    // Алиса отмечает свой день рождения! 🎈
  }
}));

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

Кинга Идем в IT: пошаговый план для смены профессии

Как контролировать сложность с помощью Immutability-helper

Если вам приходится работать со сложными вложенными состояниями, простой синтаксис расширения может оказаться недостаточным. В таких случаях на помощь приходит Immutability-helper.

JS
Скопировать код
import update from 'immutability-helper';

this.setState(prevState => update(prevState, {
  user: {
    details: {
      age: {$set: prevState.user.details.age + 1} 
      // Алиса – путешественница во времени, возраст для неё – всего лишь число!
    }
  }
}));

Это универсальное решение облегчает изменение вложенного состояния, делая процесс более понятным и упорядоченным.

Как избежать ненужной перерисовки: примечание о производительности

Обновление вложенного состояния может спровоцировать нежелательные перерисовки из-за поверхностного сравнения в shouldComponentUpdate() в React, что негативно скажется на производительности. Чтобы этого избежать, рекомендуется упростить состояние или воспользоваться MobX с наблюдаемыми объектами для более эффективного управления состоянием.

Почему прямое изменение состояния – это грубая ошибка

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

JS
Скопировать код
const [user, setUser] = useState({ name: 'Алиса', details: { age: 30 } });

// Обновляем вложенное состояние
const updateUserAge = () => {
  setUser(user => ({
    ...user,
    details: { ...user.details, age: user.details.age + 1 } 
    // Зима приближается, скоро день рождения Алисы! ❄️🎈
  }));
};

Эффективные стратегии обновления состояния

Пересмотрите вашу компонентную архитектуру

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

Подробнее об этом расскажет наш спикер на видео
skypro youtube speaker

Пользуйтесь простыми свойствами

По возможности передавайте простые свойства в дочерние компоненты. Это упростит структуру и чётко определит зависимости компонента.

Особенности обновления вложенных состояний

При работе со списками или массивами в объектах состояния требуется особое внимание, чтобы уберечься от неожиданных изменений. В таких случаях правильно используйте расширение или метод .map().

Визуализация

Представьте обновление вложенных свойств состояния в React как уход за садом из русских матрешек (🪆).

Markdown
Скопировать код
Сад (🪆): [БольшаяМатрёшка(🌺), СредняяМатрёшка(🌻), МаленькаяМатрёшка(🌼)]

Каждая Матрешка символизирует свойство состояния, а Цветок – его значение.

Markdown
Скопировать код
/** Обновляем Цветок СреднейМатрёшки **/
setState(prevState => ({
  ...prevState, 
  СредняяМатрёшка: {...prevState.СредняяМатрёшка, Цветок: 🌹}
}));

Мы аккуратно меняем цветок у Средней Матрёшки, затем возвращаем её на место. setState в React гарантирует, что остальные матрёшки остаются нетронутыми.

Markdown
Скопировать код
Исходное состояние: Сад (🪆): [🌺, 🌻, 🌼]
После обновления: Сад (🪆): [🌺, 🌹, 🌼]

Некоторые инструменты для облегчения разработки

Применяйте Object.assign для обновления вложенных состояний

Object.assign – это дополнительный способ обработки обновлений вложенного состояния:

JS
Скопировать код
this.setState(prevState => ({
  user: Object.assign({}, prevState.user, {
    details: Object.assign({}, prevState.user.details, { age: prevState.user.details.age + 1 })
  })
  // Object.assign приходит на помощь! 🦸‍♀️
}));

Новые объекты, которые создаёт Object.assign, гарантируют соблюдение принципа нерушимости состояния.

Последовательные обновления с использованием запятой

Для последовательного обновления состояния используйте оператор запятой в JavaScript:

JS
Скопировать код
this.setState(prevState => ({
  user: { ...prevState.user, name: 'Боб' },
  // Кто этот Боб? Алиса решила примерить новый образ! 💄
}), () => this.setState(prevState => ({
  user: { ...prevState.user, details: { ...prevState.user.details, age: 25 } }
  // Боб усердно занялся самосовершенствованием! 💪
})));

Избегайте ловушек в shouldComponentUpdate()

Стремитесь к упрощению shouldComponentUpdate(), особенно при работе с объемными вложенными состояниями, чтобы минимизировать проблемы с производительностью.

Полезные материалы

  1. Использование хука состояния – React — Основы работы с состоянием в функциональных компонентах при помощи хуков.
  2. Обработка событий – React — Поглубже познакомьтесь с тем, как обрабатывать события для взаимодействия со состоянием.
  3. Введение в Immer | Immer — Освойте управление нерушимым состоянием для сложных структур.
  4. reactjs – Почему нерушимость так важна (или нужна) в JavaScript? – Stack Overflow — Почему нерушимость так важна при управлении состоянием в React.
  5. Руководство по React – Полное погружение в обучение React для новичков — Знакомимся с современными принципами работы с React, включая управление состоянием.
  6. Понимание React setState | CSS-Tricks — Полное руководство по использованию метода setState в React и его возможности.
  7. GitHub – reduxjs/redux: Предсказуемое управление состоянием для JavaScript-приложений — Альтернатива для управления состоянием в приложениях: Redux.
Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Какой метод в React следует использовать для обновления состояния?
1 / 5
Свежие материалы