неопределенный не является объектом(оценка ‘addedProduct.price’).. Я не знаю, почему я получаю эту ошибку?

#javascript #reactjs #react-native #react-redux #react-hooks

Вопрос:

Мой код выглядит нормально, так как я проверил состояния, и он показывает мне, что элемент, который я добавил и удалил в состоянии, в порядке, но я не знаю, почему я получаю эту ошибку?

В CartScreen.js onRemove() отправляет действие, которое хранится в store/actions/cart.js чтобы удалить товар из корзины.

CartScreen.js

 import React from "react";
import { View, Text, FlatList, Button, StyleSheet } from "react-native";
import { useSelector, useDispatch } from "react-redux";

import Colors from "../../constants/Colors";
import CartItem from "../../components/shop/CartItem";
import * as cartActions from "../../store/actions/cart";

const CartScreen = (props) => {
  const cartTotalAmount = useSelector((state) => state.cart.totalAmount);
  const dispatch = useDispatch();
  const cartItems = useSelector((state) => {
    const transformedCartItems = [];
    for (const key in state.cart.items) {
      transformedCartItems.push({
        productId: key,
        productTitle: state.cart.items[key].productTitle,
        productPrice: state.cart.items[key].productPrice,
        quantity: state.cart.items[key].quantity,
        sum: state.cart.items[key].sum,
      });
    }
    return transformedCartItems;
  });
  return (
    <View style={styles.screen}>
      <View style={styles.summary}>
        <Text style={styles.summaryText}>
          Total:{" "}
          <Text style={styles.amount}>${cartTotalAmount.toFixed(2)}</Text>
        </Text>
        <Button
          color={Colors.primary}
          title="Order Now"
          disabled={cartItems.length === 0}
        />
      </View>
      <FlatList
        data={cartItems}
        keyExtractor={(item) => item.productId}
        renderItem={(itemData) => (
          <CartItem
            quantity={itemData.item.quantity}
            title={itemData.item.productTitle}
            amount={itemData.item.sum}
            onRemove={() => {
              dispatch(cartActions.removeFromCart(itemData.item.productId)); //this is the function to remove item from cart.
            }}
          />
        )}
      />
    </View>
  );
};

const styles = StyleSheet.create({
  screen: {
    margin: 20,
  },
  summary: {
    flexDirection: "row",
    alignItems: "center",
    justifyContent: "space-between",
    marginBottom: 20,
    padding: 10,
    shadowColor: "black",
    shadowOpacity: 0.26,
    shadowOffset: { width: 0, height: 2 },
    shadowRadius: 8,
    elevation: 5,
    borderRadius: 10,
    backgroundColor: "white",
  },
  summaryText: {
    fontFamily: "openSansBold",
    fontSize: 18,
  },
  amount: {
    color: Colors.secondary,
  },
});

export default CartScreen;

 

store/actions/cart.js:

 import { ADD_TO_CART, REMOVE_FROM_CART } from "../actions/cart";
import CartItem from "../../models/cart-item";

const intialState = {
  items: {},
  totalAmount: 0,
};

export default (state = intialState, action) => {
  switch (action.type) {
    case ADD_TO_CART:
      const addedProduct = action.product;
      const prodPrice = addedProduct.price;
      const prodTitle = addedProduct.title;

      let updatedOrNewCartItem;
      if (state.items[addedProduct.id]) {
        updatedOrNewCartItem = new CartItem(
          state.items[addedProduct.id].quantity   1,
          prodPrice,
          prodTitle,
          state.items[addedProduct.id].sum   prodPrice
        );
      } else {
        updatedOrNewCartItem = new CartItem(1, prodPrice, prodTitle, prodPrice);
      }
      return {
        ...state,
        items: { ...state.items, [addedProduct.id]: updatedOrNewCartItem },
        totalAmount: state.totalAmount   prodPrice,
      };
    case REMOVE_FROM_CART:
      const selectedCartItem = state.items[action.pid];
      const currentQty = selectedCartItem.quantity;
      let updatedCartItems;
      if (quantity > 1) {
        const updatedCartItem = new CartItem(
          selectedCartItem.quantity - 1,
          selectedCartItem.productPrice,
          selectedCartItem.productTitle,
          selectedCartItem.sum - selectedCartItem.productPrice
        );
        updatedCartItems = { ...state.items, [action.pid]: updatedCartItem };
      } else {
        updatedCartItems = { ...state.items };
        delete updatedCartItems[action.pid];
      }
      return {
        ...state,
        items: updatedCartItems,
        totalAmount: state.totalAmount - selectedCartItem.productPrice,
      };

    default:
      break;
  }
  return state;
};

 

В этом коде addedProduct.price находится в AddToCart (), который работает нормально. Я могу добавить товары в свою корзину, но если я попытаюсь удалить товар, вызвав onRemove (), это приведет к ошибке выше. Я не знаю, почему и как решить эту проблему?

Комментарии:

1. где определяется «removeFromCart»??

2. Пожалуйста, покажите нам функцию removeFromCart

3. Я почти уверен, что создатель вашего действия removeFromCart создает действие с типом ADD_TO_CART , поэтому эта часть кода редуктора выполняется, но действие не имеет свойства продукта. Это было бы достаточно легко решить, если бы у вас были devtools, работающие во время выполнения вашего проекта.

4. Спасибо вам всем! да, это было связано с типом действия. Теперь все работает нормально.

Ответ №1:

Я возвращал тип действия ADD_To_Cart в removeFromCart() , вот почему я получал эту ошибку.

До:

 export const ADD_TO_CART = "ADD_TO_CART";
export const REMOVE_FROM_CART = "REMOVE_FROM_CART";

export const addToCart = (products) => {
  return { type: ADD_TO_CART, product: products };
};

export const removeFromCart = (productId) => {
  return { type: ADD_TO_CART, pid: productId };
};
 

Итак, я исправил тип действия, возвращенного в removeFromCart() .

 export const ADD_TO_CART = "ADD_TO_CART";
export const REMOVE_FROM_CART = "REMOVE_FROM_CART";

export const addToCart = (products) => {
  return { type: ADD_TO_CART, product: products };
};

export const removeFromCart = (productId) => {
  return { type: REMOVE_FROM_CART, pid: productId };
};
 

Теперь все работает нормально.