javascript - 我不明白这个警告有什么问题 - 列表中的每个孩子都应该有一个唯一的“关键”道具
问题描述
我有这个警告,但我从Facebook查阅此页面:
警告:列表中的每个孩子都应该有一个唯一的“关键”道具。
这是我在控制台中的错误日志
我正在使用 React JS,我有一个名为 Card 的组件,它是 Carousel 的子组件和 Categories 的子组件
<Categories title='Gifs'>
<Carousel>
{
productList.map((item) => <Card product={item} key={item.id} />)
}
</Carousel>
</Categories>
这是我的主页的样子:
import React from 'react';
import Categories from '../components/Categories';
import Carousel from '../components/Carousel';
import Card from '../components/Card';
import Lead from '../components/Lead';
// import firebase from '../firebase';
import '../assets/styles/App.scss';
import { productList, randomProduct } from '../api/request';
class Homepage extends React.Component {
constructor(props) {
super(props);
console.log('Primero inicia el constructor');
this.state = {
productList: [],
randomProduct: {},
};
}
componentDidMount() {
productList().then((productList) => this.setState({ productList }));
randomProduct().then((randomProduct) => this.setState({ randomProduct }));
}
componentDidUpdate() {
console.log('quinto actualiza los datos');
}
componentWillUnmount() {
console.log('sexto desmuenta el componente --> lo elimina');
clearTimeout(this.timeoutId);
}
render() {
console.log('Segundo y Cuarto verifica que hay cambios por lo cual vuelve a reenderizar');
const { productList, randomProduct } = this.state;
return (
<div className='App'>
<Lead product={randomProduct} />
<Categories title='Textiles'>
<Carousel>
{
productList.map((item) => <Card product={item} key={item.id} />)
}
</Carousel>
</Categories>
<Categories title='Artesanias'>
<Carousel>
{
productList.map((item) => <Card product={item} key={item.id} />)
}
</Carousel>
</Categories>
<Categories title='Gifs'>
<Carousel>
{
productList.map((item) => <Card product={item} key={item.id} />)
}
</Carousel>
</Categories>
</div>
);
}
}
export default Homepage;
这是我的 Card 组件的外观:
import React, { useEffect, useState } from 'react';
import '../assets/styles/components/Card.scss';
import { LoadingRectangles } from './LoadingSpiners';
const Card = ({ product }) => {
const [isLoading, setIsLoading] = useState(true);
useEffect(() => {
// if (product.id) {
// console.log(` el product id es: ${product.id}`);
// setIsLoading(false);
// }
setIsLoading(false);
}, [product]);
return (
<div className='card'>
{ isLoading ? <LoadingRectangles /> :
(
<div>
<img className='card__img' src={product.photo1} alt={product.name} />
<div className='card__details'>
<div>
<img className='card__details--img' src='' alt='icon' />
</div>
<p className='card__details--title'>
{product.name}
</p>
<p className='card__details--subtitle'>
{product.cost}
</p>
</div>
</div>
)}
</div>
);
};
export default Card;
这是我的旋转木马:
import React from 'react';
import '../assets/styles/components/Carousel.scss';
const Carousel = ({ children }) => (
<section className='carousel'>
<div className='carousel__container'>
{children}
</div>
</section>
);
export default Carousel;
这是我的类别:
import React from 'react';
import '../assets/styles/components/Categories.scss';
const Categories = ({ children, title }) => (
<div className='categories'>
<h3 className='categories__title'>{title}</h3>
{children}
</div>
);
export default Categories;
Facebook React 文档展示了这个例子。我看不出这和我的代码之间的区别。在我看来是一样的...
function ListItem(props) {
// Correct! There is no need to specify the key here:
return <li>{props.value}</li>;
}
function NumberList(props) {
const numbers = props.numbers;
const listItems = numbers.map((number) =>
// Correct! Key should be specified inside the array.
<ListItem key={number.toString()} value={number} />
);
return (
<ul>
{listItems}
</ul>
);
}
const numbers = [1, 2, 3, 4, 5];
ReactDOM.render(
<NumberList numbers={numbers} />,
document.getElementById('root')
);
解决方案
列表中的每个孩子都应该有一个唯一的“key”道具。
但是您有 3 个列表,并且key
每次都使用相同的列表。
您可以在每个前面key
加上Textiles
等Gifs
,以确保它们是唯一的,例如key={'textile-' + item.id}
推荐阅读
- ansible - 获取ansible中变量的值
- django - 自定义Django模型时如何防止错误
- javascript - 如何在 TableLayout 中的 JSON 中进行换行?
- javascript - 找不到“createjs”。即使是“createjs”库也被引用
- python - 计算时间间隔以在熊猫数据框中形成新列
- dataframe - YARN RM 没有释放资源
- java - 在循环中使用迭代器而不会导致任何异常
- html - 有没有一种简单的方法可以使用 html/css 在文本旁边显示一行
- android - Imageview 动画在滑动手势上开始
- python - 如何在没有 __call__ 函数的情况下调用 torchaudio.transform.Resample?