0

I am mapping an array of data with props into a component. Then onClick I pull some of that data into redux/reducer from the rendered items, trying to render the same data - but in a different spot on the page.

My problem is (I assume?) that the ID's are the same - I render data with keys's/id's that were already taken - while React wants unique ones.

I am not sure, if that's what's causing the problem - but I keep getting a warning that react wants unique key props.

(it's a shop app - on click, i want to add the chosen item to a cart with redux... )

Thoughts?

here I am building the component to render

import { useDispatch, useSelector } from 'react-redux'
import { add } from '../features/addToCart'

export const ReduxshopProps = (props) => {
const dispatch = useDispatch()
const handleAddToCart = (props) => {
  dispatch(add(props));
};





  return (<>
                <div key={props.id} className='shopitem'>
                    <img src={props.url} />
                    <h2>{props.title}</h2>
                    <p className='boldprice'>${props.price}</p>
                    <button onClick={() => handleAddToCart(props) }
                      > 
                      
                      ADD TO CART
                      </button>

                    
                </div>
        </>
  )
}

here I am passing data into the component

import React from "react"
import { ReduxshopProps } from "./ReduxshopProps"
import shopdata from "./shopdata"



export default function ReduxShop() {


    const cards = shopdata.map(props => {
        return (
            <ReduxshopProps 
            key={props.id}
            title={props.title}
            price={props.price}
            url={props.url} 
        
            />
        )
    })
    return (
    <div className='shopwrapper'>
      <h1>TradingView Indicators</h1>
        <div className='itemWrapper'>
             {cards}
        </div>
    </div>
    )
}

here's the REDUX code that pulls data from above

import { createSlice } from "@reduxjs/toolkit";

const initialState = {
    cartItems: [],
    cartTotalQuantity: 0,
    cartTotalAmount: 0,
}


export const addToCartSlice = createSlice({
    name: 'cart',
    initialState,
    reducers: {
        
        add(state, action ) {

            const itemIndex = state.cartItems.findIndex(
                (item) => item.id === action.payload.id
                );
                if(itemIndex >= 0){
                    state.cartItems[itemIndex].cartQuantity += 1
                } else {
                    const tempProduct = {...action.payload, cartQuantity: 1}
                    state.cartItems.push(tempProduct);
                }

            
        },
    },

});

export const {add} = addToCartSlice.actions;

export default addToCartSlice.reducer;

and here I'm trying to render the data when someone clicks on a button.. onClick it acts as all components have the same ID - also I'm getting the key prop error from here, below

import React from 'react'
import { useSelector } from 'react-redux'


function Cart() {
    const cart = useSelector((state) => state.cart)


  return (
    <div>
        <h1>Cart</h1>
        {cart.cartItems.map(cartItem => (
            <div key={cartItem.id}>
            <p>product : {cartItem.title}</p>
            <p>price {cartItem.price}</p>
            <p>quantity : {cartItem.cartQuantity}</p>
            <p>url : <img src={cartItem.url} /></p>
            </div>
        ))}
    </div>
  )
}

export default Cart

1 Answers1

0

What you are trying to do is, assign UUID

First in terminal:

npm install uuid

Then:

import { v4 as uuidv4 } from 'uuid';
uuidv4(); // ⇨ '9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d'
Maifee Ul Asad
  • 3,992
  • 6
  • 38
  • 86