Я изучаю React и Redux, и сейчас читаю Pro React 16 Адама Фримена.Рассмотрим этот редуктор пример из главы 5. Этот редуктор обрабатывает действия, которые изменяют корзину покупок.Вот часть редуктора:
import { ActionTypes } from "./Types";
export const CartReducer = (storeData, action) => {
let newStore = { cart: [], cartItems: 0, cartPrice: 0, ...storeData }
switch(action.type) {
case ActionTypes.CART_ADD:
const p = action.payload.product;
const q = action.payload.quantity;
let existing = newStore.cart.find(item => item.product.id === p.id);
if (existing) {
existing.quantity += q;
} else {
newStore.cart = [...newStore.cart, action.payload];
}
newStore.cartItems += q;
newStore.cartPrice += p.price * q;
return newStore;
Насколько я понимаю, редукторы должны быть чистыми функциями, но этот, похоже, изменяет аргумент магазина storeData
, когда продукт уже существует вcart
массив.В частности, он обновляет свойство quantity
элемента корзины existing
, полученное из мелкой копии массива storeData
cart
.Таким образом, storeData
будет изменен как побочный эффект.
Я прав?