数组或迭代器中的每个子项在 reactjs 中都应该有一个唯一的“key” prop

IT技术 javascript reactjs key
2021-05-02 23:38:00

我完全困惑,因为我的控制台出错了,我阅读了 reactjs 文档和有关 stackoverflow 的所有提示,但我无法理解问题是什么。我看到书名列表 ({item.volumeInfo.title}),但控制台有错误。

这是我的代码:

import React, { Component } from 'react';
import { connect } from 'react-redux';

class BookList extends Component {
    renderBook(mainData) {
        return(
             <ul>
                {mainData.items.map((item, i) => {
                    return <li key={i} item={item}>{item.volumeInfo.title}</li>
                    })}
             </ul>
        )
    }

    render(){
        return (
            <div className="book-row">
                <div className="book-info">
                    {this.props.book.map(this.renderBook)}
                </div>
            </div>
        );
    }
}

function mapStateToProps({book}) {
    return {book};
}

export default connect(mapStateToProps)(BookList);

它是 API 响应的一部分:

{ "kind": "books#volumes", 
 "totalItems": 288, 
 "items": [ 
  {
   "kind": "books#volume",
   "id": "yXlOAQAAQBAJ",
   "etag": "CG7f2mQ+7Nk",
   "selfLink": "https://www.googleapis.com/books/v1/volumes/yXlOAQAAQBAJ",
   "volumeInfo": {
    "title": "Nineteenth Century Home Architecture of Iowa City",
    "subtitle": "A Silver Anniversary Edition"

我试着做下一个键:

key={item.etag}, key={i}, key={item.volumeInfo.title}

但错误仍然存​​在。

请帮忙。

太感谢了。

2个回答

由于您正在映射book

{this.props.book.map(this.renderBook)}

ul还需要一个keyprops:

renderBook(mainData, bookIdx) {
        return(
             <ul key={bookIdx}>
                {mainData.items.map((item, i) => {
                    return <li key={i} item={item}>{item.volumeInfo.title}</li>
                    })}
             </ul>
        )
    }

这是因为会有很多ul兄弟姐妹,React 需要区分它们(与 相同li)。

但是,最好(如果可能)使用不是数组索引的键。因此,如果book并且item有唯一标识符,最好使用它。

因此,看起来您在提供的示例数据之外还有另一个数组:

[
 { "kind": "books#volumes", 
   "totalItems": 288, 
   "items": [ 
    {

原因是使用两个map,并分配key只有一个,分配key<ul>还,因为这是给你的错误,试试这个:

renderBook(mainData, index) {
    return(
        <ul key={index}>
            {mainData.items.map((item, i) => {
                 return <li key={i} item={item}>{item.volumeInfo.title}</li>
             })}
        </ul>
      )
}