Вы должны всегда обновлять состояние или любое из его полей:
handleDecrease = counterId => {
// This is always Called
this.setState(prevState => {
const { oldCounterMap } = prevState;
newCounterMap = new Map(oldCounterMap);
const counter = oldCounterMap.get(counterId);
newCounterMap.set(counterId, {...counter, value: counter.value - 1});
return Object.assign({}, prevState, { counterMap: newCounterMap })
});
}
Пояснение:
Прежде всего, если вам нужно вычислить новое значение состояния на основе старого значения, вам следует использовать эту сигнатуру setState
: setState(previousState => {})
, которая передает вам текущее состояние в качестве аргумента.
Затем, чтобы постоянно обновлять счетчик, нам сначала нужно клонировать таблицу счетчиков:
newCounterMap = new Map(oldCounterMap);
Вы можете видеть, что это клон, потому что newCounterMap === oldCounterMap
это false
.
Затем мы продолжаем и обновляем эту карту, как нам нравится:
newCounterMap.set(counterId, {...counter, value: counter.value - 1});
Обратите внимание на расширение объекта, которое снова вызывает создание целого нового объекта на основе counter
(это просто хорошая практика, даже если это не является критически необходимым).
И, наконец, мы возвращаем новый объект, чтобы заменить наше текущее состояние.
return Object.assign({}, prevState, { counterMap: newCounterMap })
Опять же, обратите внимание, что я использовал растяжение объектов здесь, так что мы оба возвращаем новый объект, а также оставляем другие значения без изменений (не перезаписываем другие записи state
)