Each child in a list should have a unique "key" prop console error

Viewed 40

Please help! I don't know why I'm getting this error. I can't find what I need to change :( The needed output in browser is perfectly fine. But I am getting this error. I'm not used to list and keys on react. I have the latest versions of React and Nodejs and the packages needed

Homescreen.js:

import React, { useState, useEffect } from 'react'
import axios from 'axios';
import Room from '../components/Room';
import Loader from '../components/Loader';
import Error from '../components/Error';


function Homescreen() {
  let [rooms, setrooms] = useState([]);
  const [loading, setloading] = useState();
  const [error, seterror] = useState();

  useEffect(() => {
    async function getResults() {
      try {
        seterror(false);
        setloading(true);
        const data = (await axios('/api/rooms/getallrooms')).data;
        setrooms(data);
        setloading(false);
      } catch (e) {
        seterror(true);
        setloading(false);
      }
    }
    getResults();
  }, []);


  return (
    <div className='container'>

      <div className='row justify-content-center mt-5'>
        {loading ? (
          <Loader />
        ) : rooms.length > 1 ? (
          rooms.map(room => {
            return <div className="col-md-9 mt-3">
              <Room room={room} />
            </div>;
          })
        ) : (
          <Error />
        )}

      </div>

    </div>
  )
}

export default Homescreen;

//<h1>{room.name}</h1>

and my Room.js:

import React, { useState } from "react";
import { Modal, Button, Carousel } from 'react-bootstrap'
import { First } from "react-bootstrap/esm/PageItem";
import { Link } from 'react-router-dom'


function Room({ room }) {
    const [show, setShow] = useState(false);

    const handleClose = () => setShow(false);
    const handleShow = () => setShow(true);



    return (
        < div className="row bs" >
            <div className="col-md-4">
                <img src={room.imageurls[0]} className="smallimg" />
            </div>
            <div className="col-md-7">
                <h1>{room.name}</h1>
                <b>
                    {" "}
                    <p>Max Count : {room.maxcount}</p>
                    <p>Phone Number : {room.phonenumber}</p>
                    <p>Type : {room.type}</p>
                </b>

                <div style={{ float: "right" }}>
                    <Link to={`/book/${room._id}`}>
                        <button className="btn btn-primary m-5">Book Now!</button>
                    </Link>
                    <button className="btn btn-primary" onClick={handleShow}>View Details</button>
                </div>
            </div>

            <Modal show={show} onHide={handleClose} size='lg'>
                <Modal.Header>
                    <Modal.Title>{room.name}</Modal.Title>
                </Modal.Header>
                <Modal.Body>

                    <Carousel prevLabel='' nextLabel=''>

                        {room.imageurls.map(url => {
                            return <Carousel.Item>
                                <img
                                    className="d-block w-100 bigimg"
                                    src={url}
                                />
                            </Carousel.Item>

                        })}
                    </Carousel>
                    <p>{room.description}</p>
                </Modal.Body>
                <Modal.Footer>
                    <Button variant="secondary" onClick={handleClose}>
                        Close
                    </Button>
                </Modal.Footer>
            </Modal>


        </div>

    );
}


export default Room;

Browser Console Error: enter image description here

1 Answers

You have to give the first element in a map function a key:

rooms.map((room, index) => {
  return (
    <div key={index} className="col-md-9 mt-3">
      <Room room={room} />
    </div>
  );
});
Related