Problemas:
1- Warning sobre la key repetida al agregar al carrito el mismo elemento.
2- Si los “productos” agregados son exactamente el mismo, al darle a la X en uno solo, se borran todos los elementos agregados al carrito.
Soluciones:
1- Esto sucede en …/containers/MyOrder.jsx dado que se está usando key={product. id} y pues cuando se agregue al carrito los elementos harán referencia al mismo, o sea React dice como, WTF porque se está renderizando el mismo componente ¿?, el Virtual DOM llora, a React le gustan las keys únicas… Pero es fácil solucionarlo, dado que, map, tiene como su segundo termino, el index del vector de COMPONENTES <OrderItem /> que se está renderizando. Por lo que solo hay que cambiar en esa parte lo siguiente:
{state.cart.map((product,index) => (
<OrderItem
indexValue={index}
key={index}
product={product}
/>
))}
Si te fijaste, hay dice también indexValue={index}, eso es para solucionar el problema 2.
2-Que se borren todos al querer solo eliminar uno, es porque se estaba utilizando como condicional del filter en useInitialState.js el id del producto, y pues si son iguales, pos todos cumplen con la condición. 😅
Así que solo hay que llevar ese valor de indexValue a OrderItem.jsx, y NO product.
const OrderItem = (props) => {
// a mi me gusta asi, pero puedes poner lo que esta
// dentro de { } ahí arriba en vez de props
const { product, indexValue } = props
const { removeFromCart } = React.useContext(AppContext)
const handleRemove = (index) => {
removeFromCart(index)
}
return (
<div className="OrderItem">
<figure>
<img src={product.images[0]} alt={product.title} />
</figure>
<p>{product.title}</p>
<p>{product.price}</p>
<img
src={iconClose}
alt="close"
onClick={() => handleRemove(indexValue )}
/>
</div>
);
}
export default OrderItem;
Ahí le estamos pasando un indexValue unico del vector que se esta creando en addToCart a handleRemove.
Veamos entonces que pasa con ese filter de useInitialState.js:
const removeFromCart = (indexValue) => {
setState({
...state,
cart: state.cart.filter((product,index) => index !== indexValue),
})
}
Si, ya se, product queda de “adorno” pero pues filter funciona así, filter(element, index), y nosotros solo necesitamos el index. Ese condicional lo que dice es: “SALVA TODOS” los elementos (<OrderItem />) del vector state.cart que NO tengan ese indexValue que llega. El index que llega por supuesto es al que le hacemos click. Por lo tanto, lo saca del vector y el nuevo vector state.cart es sin ese elemento al que hicimos click en la X.
Gráficamente seria (esto es solo ilustrativo, ni es una sintaxis correcta 😬):
<MyOrder>
<OrderItem
index=0
product=🤡
removeCart(click( if (index=indexValue)))
/>
<OrderItem
index=1
product=🤡
removeCart(click( if (index=indexValue)))
/>
<OrderItem
index=2
product=🤡
removeCart(click( if (index=indexValue)))
/>
</MyOrder>
Besos 😗
Los aportes, preguntas y respuestas son vitales para aprender en comunidad. Regístrate o inicia sesión para participar.