Ошибка типа: не удается прочитать свойство ‘length’ редуктора undefined — React

#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 может привести к добавлению товара несколько раз при обновлении.