Реагировать - невозможно увеличить количество / добавить несколько товаров в корзину - PullRequest
0 голосов
/ 05 марта 2020

У меня проблема с корзиной. Невозможно увеличить количество существующего товара в корзине или добавить другой товар. При нажатии кнопки запускается функция addToCart, которая принимает продукт.

const [cartItems, setCartItems] = useState([])

const addToCart = product => {
    console.log(product) // here I am getting the entire product
    const index = cartItems.findIndex(item => item._id === product._id);

    if (index === -1) {
      const updateCart = cartItems.concat({
        ...product,
        quantity: 1
      });
      setCartItems(updateCart);
    } else {
      const updateCart = [...cartItems];
      updateCart[index].quantity += 1;
      setCartItems(updateCart);
    }
  };

Я получаю только 1 количество продукта, и если я добавляю другой продукт или увеличиваю количество, он перезаписывается.

Ответы [ 2 ]

0 голосов
/ 05 марта 2020

Ваш код должен работать, это неплохо

  • возможно, метод тестирования не удался
  • проблемы были связаны с различными частями кода

let cartItems = [
  {
_id: "1",
name: "shoe",
quantity: 1
  }
];

console.log("START", JSON.stringify(cartItems), Array.isArray(cartItems));

const addToCart = product => {
  console.log(product); // here I am getting the entire product
  const index = cartItems.findIndex(item => item._id === product._id);

  if (index === -1) {
const updateCart = cartItems.concat({
  ...product,
  quantity: 1
});
cartItems = updateCart;
console.log("ADD", JSON.stringify(cartItems), Array.isArray(cartItems));
  } else {
// original ... just works ...
// const updateCart = [...cartItems];
// updateCart[index].quantity += 1;

// ... this works, too
// cartItems[index].quantity += 1;
// const updateCart = [...cartItems];

// ... but this is safer (in react) as it replaces item with a new object
const updateCart = [...cartItems];
// new object for replace existing one
updateCart[index] = {
  ...updateCart[index],
  quantity: updateCart[index].quantity + 1
};
cartItems = updateCart;

console.log("INC", JSON.stringify(cartItems), Array.isArray(cartItems));
  }
};

var product1 = {
  _id: "1",
  name: "shoe"
};
var product2 = {
  _id: "2",
  name: "apple"
};
addToCart(product1);
addToCart(product2);
addToCart(product1);
console.log("END", JSON.stringify(cartItems), Array.isArray(cartItems));

рабочий пример

Достаточно ли это хорошо? Не для реакции

Замена элемента [-line] в корзине новым объектом может потребоваться в реакции, когда вы визуализируете корзину с использованием компонентов. fe:

cartItems.map( item => <CartOrderLine key={item._id} data={item} /> )

<CartOrderLine /> с тем же data объектом ref (мутированный quantity только реквизит, не замененный) не будет перерисован!

0 голосов
/ 05 марта 2020

Ваш логин else c неверен. Вы хотите обновить количество товаров из carItems, прежде чем распространять их. Изменить:

const updateCart = [...cartItems];
updateCart[index].quantity += 1;
setCartItems(updateCart);  

на

      cartItems[index].quantity += 1;
      const updateCart = [...cartItems];
      setCartItems(updateCart);  

Редактировать: увидеть это в действии ниже:

let cartItems = [{
  _id: "1",
  name: "shoe",
  quantity: 1
}];

const addToCart = product => {
  console.log(product) // here I am getting the entire product
  const index = cartItems.findIndex(item => item._id === product._id);

  if (index === -1) {
    cartItems.push({
      ...product,
      quantity: 1
    });
    const updateCart = [...cartItems];
    console.log(updateCart);
  } else {
    cartItems[index].quantity += 1;
    const updateCart = [...cartItems];
    console.log(updateCart);
  }
};

var product1 = {
  _id: "1",
  name: "shoe"
};
var product2 = {
  _id: "2",
  name: "apple"
};
addToCart(product1);
addToCart(product2);
...