Obtener el siguiente error mientras se utiliza React Redux - TipoError: No se puede leer la propiedad 'id' de undefinido
Estoy trabajando en un proyecto de comercio electrónico usando React Redux, y no puedo tener mi cabeza alrededor de este error que me ha estado molestando. Estoy tratando de añadir el elemento clicado (junto con sus props como nombre, imageUrl, etc.) a la matriz cartItems a través del reductor del carrito. Creado una función para hacer la adición en utilidades y tratando de importar y utilizar que en el reductor (función añade un nuevo prop al elemento llamado cantidad para contar la frecuencia del artículo). Pero por alguna razón, la función está creando algún elemento nuevo con sólo 1 prop, cantidad cada vez, en lugar de añadir el elemento clicado con el prop añadido.
Mi código de componente de acciones -
import CartActionTypes from './cart.types';
export const toggleCartHidden = () => ({
type: CartActionTypes.TOGGLE_CART_HIDDEN
});
export const addItem = item => ({
type: CartActionTypes.ADD_ITEM,
action: item
});
cart reductor -
import CartActionTypes from './cart.types';
import { addItemToCart } from './cart.utils';
const INITIAL_STATE = {
hidden: true,
cartItems: []
};
const cartReducer = (state = INITIAL_STATE, action) => {
switch (action.type) {
case CartActionTypes.TOGGLE_CART_HIDDEN:
return {
...state,
hidden: !state.hidden
};
case CartActionTypes.ADD_ITEM:
return {
...state,
cartItems: addItemToCart(state.cartItems, action.payload)
};
default:
return state;
}
};
export default cartReducer;
utiles -
export const addItemToCart = (cartItems, cartItemToAdd) => {
const existingCartItem = cartItems.find(
cartItem => cartItem.id === cartItemToAdd.id
);
if (existingCartItem) {
return cartItems.map(cartItem =>
cartItem.id === cartItemToAdd.id
? { ...cartItem, quantity: cartItem.quantity + 1 }
: cartItem
)
}
return [...cartItems, { ...cartItemToAdd, quantity: 1 }];
};
el componente de la colección a continuación, que muestra el elemento que debe añadirse (este componente se llama al componente de visualización que mapea los datos del artículo al componente del elemento para mostrar todos los elementos). El artículo clicado debe añadirse con el prop de cantidad creado para el mismo artículo a través del reductor.
import React from 'react';
import { connect } from 'react-redux';
import CustomButton from '../custom-button/custom-button.component';
import { addItem } from '../../Redux/cart/cart.actions';
import './collection-item.styles.css';
const CollectionItem = ({ item, addItem }) => {
const { name, price, imageUrl } = item;
return (
{name}
{price}
addItem(item)} inverted>
Add to cart
);
};
const mapDispatchToProps = dispatch => ({
addItem: item => dispatch(addItem(item))
});
export default connect(
null,
mapDispatchToProps
)(CollectionItem);
Colección vista previa (usos CollectionItem) -
import React from 'react';
import CollectionItem from '../collection-item/collection-item.component';
import './collection-preview.styles.css';
const CollectionPreview = ({ title, items }) => (
{title.toUpperCase()}
{items
.filter((item, idx) => idx < 4)
.map(item => (
))}
);
export default CollectionPreview;
La captura de pantalla de error -
La acción correcta (ADD_ITEM) se está activando y está capturando ese elemento clicado, pero de alguna manera no se añade a la matriz cartItems. Cualquier ayuda sería apreciada.
Pregunta hecha hace 3 años, 4 meses, 28 días - Por bytebuster
2 Respuestas:
-
El error que estás experimentando se debe a un pequeño error en la definición de tus acciones en el componente CollectionItem. En el componente CollectionItem, estás llamando a la función addItem con el prop 'item' que es un objeto, pero según la definición de la función addItem en las acciones de carrito, debería ser pasado como 'action' en lugar de 'item'.
Aquí está la corrección que debes realizar en el componente CollectionItem:
jsx
addItem(item)} inverted> Add to cart Además, asegúrate de importar correctamente el componente CustomButton en CollectionItem y de que CustomButton esté preparado para recibir la función onClick como prop.
Una vez que hagas esta corrección, el elemento clicado debería ser añadido correctamente a la matriz cartItems a través del reductor del carrito. ¡Espero que esto te ayude a solucionar el problema!
Respondida el Dec 18, 2020 a las 13:11 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
He revisado tu código y he identificado un par de posibles problemas que podrían estar causando el error "TypeError: Cannot read property 'id' of undefined".
- Componente de colección:
En el componente
CollectionItem
, estás intentando acceder a la propiedaditem
directamente en el controlador de eventosonClick
:javascript
Add to cart Sin embargo,
addItem
es una función de acción de Redux que espera recibir un objeto de acción como argumento. Debes envolver la llamada aaddItem
en una función anónima para crear un nuevo objeto de acción:javascript
Add to cart - Función `addItemToCart`:
En la función
addItemToCart
, estás intentando acceder a la propiedadid
del objetocartItemToAdd
en este código:javascript const existingCartItem = cartItems.find( cartItem => cartItem.id === cartItemToAdd.id );
Sin embargo, parece que el objeto
cartItemToAdd
que estás pasando aaddItemToCart
no tiene una propiedadid
. Asegúrate de que el objetoitem
pasado a la acciónaddItem
tenga una propiedadid
definida.Solución propuesta:
- Actualiza el componente `CollectionItem` para que llame a `addItem` correctamente:
javascript
Add to cart - Verifica que el objeto `item` pasado a la acción `addItem` tenga una propiedad `id` definida.
Después de realizar estos cambios, vuelve a ejecutar tu aplicación y comprueba si el error desaparece.
Respondida el Dec 18, 2020 a las 13:15 - por Gemini
Votos positivos: 0 | Votos negativos: 0