Не изменяйте свое состояние таким образом для Redux или React.Копирование объектов не создает разные объекты.Если вы изменяете свойство на новое, вы также изменяете исходное свойство.
Обычно мы используем Object.assign
или расширенный синтаксис в сочетании с такими методами, как .map
, .filter
.Object.assign
или синтаксис распространения тоже не создает совершенно разных объектов.Они создают неглубокие копии, это означает одну копию уровня.Если вы изменяете вложенное свойство для нового объекта, вы снова изменяете исходное.Итак, объедините все эти инструменты.
case types.ADD_ITEM_CART: {
// We are mapping our related array.
const newProducts = state.products.map( el => {
// If id does not match, return the element without doing nothing.
if ( el.id !== action.id ) { return el };
// id match, increment the quantity.
return { ...el, quantity: el.quantity + 1 };
})
// Lastly, return our state again without mutating it.
return { ...state, products: newProducts };
}
Если мы хотим удалить элемент из массива, мы обычно используем для этого метод .filter
.
const newProducts = state.products.filter( el => el.id !== action.id );
return { ...state, products: newProducts };