#javascript #reactjs
#javascript #reactjs
Вопрос:
Когда я добавляю количество товара на странице товара, все работает правильно, и это переводит меня в корзину, где показано, какое количество я выбрал.
Когда я пытаюсь обновить количество товара в корзине, он выдает мне ошибку.
Мой код экрана корзины:
function CartScreen(props) {
const cart = useSelector((state) => state.cart);
const { cartItems } = cart;
const productId = props.match.params.id;
const qty = props.location.search
? Number(props.location.search.split("=")[1])
: 1;
const dispatch = useDispatch();
const removeFromCartHandler = (productId) => {
dispatch(removeFromCart(productId));
};
useEffect(() => {
if (productId) {
dispatch(addToCart(productId, qty));
}
}, []);
return (
<div>
<Header />
<div className="cart">
<div className="cart-list">
<ul className="cart-list-container">
<li>
<h3>Shopping Cart</h3>
<div>Price</div>
</li>
{cartItems.length === 0 ? (
<div>Cart is empty</div>
) : (
cartItems.map((item) => (
<li>
<div className="cart-image">
<img src={item.image} alt="product" />
</div>
<div className="cart-name">
<div>
<Link to={"/product/" item.product}>{item.name}</Link>
</div>
<div>
Qty:
<select
value={item.qty}
onChange={(e) =>
dispatch(addToCart(item.product, e.target.value))
}
>
{[...Array(item.countInStock).keys()].map((x) => (
<option key={x 1} value={x 1}>
{x 1}
</option>
))}
</select>
<button
type="button"
className="button"
onClick={() => removeFromCartHandler(item.product)}
>
Delete
</button>
</div>
</div>
<div className="cart-price">${item.price}</div>
</li>
))
)}
</ul>
</div>
<div className="cart-action">
<h3>
Subtotal ( {cartItems.reduce((a, c) => a c.qty, 0)} items) : ${" "}
{cartItems.reduce((a, c) => a c.price * c.qty, 0)}
</h3>
<button
className="button primary full-width"
disabled={cartItems.length === 0}
>
Proceed to Checkout
</button>
</div>
</div>
</div>
);
}
Мой код CartAction:
import axios from "axios";
import { CART_ADD_ITEM, CART_REMOVE_ITEM } from "../constants/cartConstants";
const addToCart = (productId, qty) => async (dispatch, getState) => {
try {
const { data } = await axios.get("/api/products/" productId);
dispatch({
type: CART_ADD_ITEM,
payload: {
product: data._id,
name: data.name,
image: data.image,
price: data.price,
countInStock: data.countInStock,
qty,
},
});
} catch (error) {}
};
const removeFromCart = (productId) => (dispatch) => {
dispatch({ type: CART_REMOVE_ITEM, payload: productId });
};
export { addToCart, removeFromCart };
Ответ №1:
В компоненте CartScreen, для чего он указан в консоли cartItems
?
Просто проверьте свой код с помощью useSelector
hook и что он возвращает.
он должен возвращать объект с cartitems
ключом со значением в виде массива.
Вы могли бы даже сделать это, чтобы избежать ошибки и определить значение по умолчанию, а также исправить возвращаемое значение объекта в useSelector
.
const { cartItems = [] } = cart;
Комментарии:
1. Когда я пытаюсь добавить const { cartItems = [] } = cart; все из моей корзины удаляется. Если вы можете проверить мой github, где мой проект: github.com/haris-hthc/ed-vision-shop
2. Наблюдения: 1. Переименуйте папку
Screens
вscreens
так, как вы импортируете изscreens
. 2. Проверьте ответ вашейaddToCart
функции REST API. У меня это сработало с фиктивными данными, поскольку у меня нет доступа к вашему REST API. Предложение: добавить в корзину на самой странице продукта, а затем перенаправить на страницу корзины, если необходимо, потому что добавление параметров url может привести к добавлению товара несколько раз при обновлении.