当前位置: 首页 > 知识库问答 >
问题:

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

殷学
2023-03-14

我完全糊涂了,因为我的控制台有错误,我阅读了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.volumenfo.title}

但错误仍然存在。

请帮忙。

非常感谢你。

共有2个答案

陆高峰
2023-03-14

原因是您使用两个map,并将key分配到一个,将key分配到

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

祁烨
2023-03-14

因为您正在映射book

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

ul还需要一个道具:

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相同)。

但是,最好(如果可能)使用不是数组索引的键。因此,如果bookitem具有唯一标识符,则最好使用该标识符。

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

[
 { "kind": "books#volumes", 
   "totalItems": 288, 
   "items": [ 
    {
 类似资料: