JS: React
Теория: Неизменяемость
Неизменяемость состояния — одна из ключевых тем в React. Её легко придерживаться, работая с примитивными типами данных, но с составными, такими как объекты и массивы, у неподготовленного пользователя могут возникнуть сложности. В этом уроке рассматриваются основные способы частичного обновления объектов и массивов.
Кроме примеров на чистом JS, будут продемонстрированы примеры с использованием библиотеки immutability-helper, которая создана для облегчения выполнения подобных операций. Она особенно актуальна при выполнении обновлений там, где код на JS получается слишком сложным.
Массивы
Массив: добавление
Самое простое — это добавление в массив:
Если необходимо добавить элемент в начало, то нужно всего лишь поменять местами элементы массива:
Использование immutability-helper
Массив: удаление
Более интересный пример. Чтобы успешно выполнить удаление, нужно знать, что удалять. Это значит, что каждый элемент в коллекции должен иметь идентификатор. Для удаления используется старая добрая фильтрация.
Может возникнуть вопрос: откуда взялся идентификатор внутри обработчика? И здесь нам на помощь приходят замыкания.
https://codepen.io/hexlet/pen/JygbWP
Обратите внимание на способ задания обработчика: removeItem = (id) => (e) => { и его использование onClick={this.removeItem(id)}.
Использование immutability-helper
Удаление на чистом JS через фильтр — самый оптимальный способ. С использованием immutability-helper получается сложно.
Массив: изменение
К сожалению, без дополнительных инструментов код решения будет слишком громоздким. Он приведён для ознакомления, но в реальном коде так делать не надо.
Думаю, не придётся вас убеждать в том, что это перебор :)
Использование immutability-helper
Как видно, этот способ значительно проще и чище. Рекомендуется к использованию.
Объекты
Объект: добавление
Так же просто, как и с массивом.
Либо, если ключ вычисляется динамически, нужно делать так:
Объект: удаление
На помощь приходит деструктуризация:
Использование immutability-helper
Объект: изменение
Абсолютно то же самое, что и добавление.
Использование immutability-helper
Глубокая вложенность
В примерах выше в основном можно обходиться стандартными средствами JS, и только в некоторых ситуациях удобнее пользоваться сторонними решениями. В реальном коде всё будет также, особенно если учитывать рекомендацию React и держать состояние максимально плоским. Но в некоторых ситуациях данные, которые нужно изменить, находятся не на поверхности, а в глубине структур. К сожалению, в этих ситуациях обычный JS-код будет раздуваться. И тут уже точно не обойтись без дополнительных библиотек.
https://repl.it/@hexlet/js-react-immutability-helper
Аналоги
immutability-helper — не единственная библиотека для подобных задач. Вот еще несколько популярных:
- immutable-js — основана на персистентных данных
- updeep — активно использует каррирование
- immerjs — пожалуй, самая популярная библиотека в JS для работы с неизменяемыми данными




