У меня проблема, из-за которой повторный рендеринг состояния вызывает проблемы с пользовательским интерфейсом, и мне было предложено обновить только определенное значение внутри моего редуктора, чтобы уменьшить количество повторного рендеринга на странице.
это пример моего состояния
{
name: "some name",
subtitle: "some subtitle",
contents: [
{title: "some title", text: "some text"},
{title: "some other title", text: "some other text"}
]
}
и сейчас я обновляю его вот так
case 'SOME_ACTION':
return { ...state, contents: action.payload }
где action.payload
- целый массив, содержащий новые значения. Но теперь мне просто нужно обновить текст второго элемента в массиве содержимого, и что-то вроде этого не работает.
case 'SOME_ACTION':
return { ...state, contents[1].text: action.payload }
где action.payload
теперь текст, который мне нужно обновить.
javascript
reactjs
redux
Илья
источник
источник
kolodny/immutability-helper
, так что теперь онyarn add immutability-helper
иimport update from 'immutability-helper';
Вы можете использовать
map
. Вот пример реализации:источник
Необязательно делать все в одной строке:
источник
Очень поздно для вечеринки, но вот общее решение, которое работает со всеми значениями индекса.
Вы создаете и распространяете новый массив из старого массива до того,
index
который хотите изменить.Добавьте нужные данные.
Создайте и распределите новый массив из того, что
index
вы хотите изменить, до конца массиваОбновить:
Я сделал небольшой модуль для упрощения кода, поэтому вам просто нужно вызвать функцию:
Дополнительные примеры см. В репозитории
сигнатура функции:
источник
Я считаю, что когда вам нужны такие операции с вашим состоянием Redux, оператор распространения - ваш друг, и этот принцип применим ко всем детям.
Представим, что это ваше состояние:
И вы хотите добавить 3 очка Когтеврану
Используя оператор распространения, вы можете обновить только новое состояние, оставив все остальное нетронутым.
Пример взят из этой замечательной статьи , вы можете найти практически все возможные варианты с отличными примерами.
источник
В моем случае я сделал что-то вроде этого, основываясь на ответе Луиса:
источник
Вот как я это сделал для одного из своих проектов:
источник
Боюсь, что использование
map()
метода массива может быть дорогостоящим, поскольку нужно повторять весь массив. Вместо этого я объединяю новый массив, состоящий из трех частей:Вот пример, который я использовал в своем коде (NgRx, но механизм такой же для других реализаций Redux):
источник