Reputation: 73
I need help with figuring out why when I use a function component, I do not get a warning of this type:
index.js:1446 Warning: Each child in an array or iterator should have a unique "key" prop.
When I use a class component, this warning pops out.
Thank you in advance for clarification.
function component:
import React from 'react';
import VideoItem from './VideoItem';
const VideoList = ({videos, selectedVideo}) =>{
const renderedItems = videos.map((video) =>{
return <VideoItem key={video.id.videoId} video={video} selectedVideo={selectedVideo}/>
})
return <div>{renderedItems}</div>
}
export default VideoList;
class Component:
import React, { Component } from 'react';
import VideoItem from './VideoItem';
class VideoList extends Component {
render() {
const renderedItems = this.props.videos.map((video) => {
return <div><VideoItem key={video.id.videoId} video={video} selectedVideo={this.props.selectedVideo}/></div>
})
return(
<div>{renderedItems}</div>
)
}
}
export default VideoList;
Upvotes: 0
Views: 2207
Reputation: 387
In React, in a iteration, each iteration root element should have a key attribute.
In your example, you gave key attribute to VideoItem component. That's the wrapping div who should have it.
import React, { Component } from 'react';
import VideoItem from './VideoItem';
class VideoList extends Component {
render() {
const renderedItems = this.props.videos.map((video) => {
return <div key={video.id.videoId}><VideoItem video={video} selectedVideo={this.props.selectedVideo}/></div>
})
return(
<div>{renderedItems}</div>
)
}
}
export default VideoList;
Upvotes: 1
Reputation: 884
In your class component, the key
attribute needs to be on the wrapper div
element.
Upvotes: 2
Reputation: 549
const renderedItems = this.props.videos.map((video) => {
return <VideoItem key={video.id.videoId} video={video} selectedVideo={this.props.selectedVideo}/>
})
key must be on Div or remove it
Upvotes: 2
Reputation: 6692
Maybe your id is not always unique?
Try this (adding idx in map fn)
const renderedItems = this.props.videos.map((video, idx) => {
return <div><VideoItem key={idx} video={video}
selectedVideo={this.props.selectedVideo}/></div>
})
Upvotes: 0