唯一键反应,解决方案?
Unique key React, solution?
如何在此代码中传递密钥?
{result.map(book, key =>
我卡在这里了。我试了好几次都不行!
{
result.map(book => (
<div className="col-md-3 mb-5">
<div className="card card-body bg-light text-center h-100">
<img className="w-100 mb-2" src={book.volumeInfo.imageLinks !== undefined ? book.volumeInfo.imageLinks.thumbnail : ''} alt={book.title} />
<h3 className="text-dark card-title">{book.volumeInfo.title}</h3>
<h5 className="text-dark card-title">{book.volumeInfo.authors}</h5>
</Link>
</div>
</div>
))
}
Key 属性 必须是唯一的,以免破坏 React 规则。所以我建议你使用 book.id 如果它有 属性 或数组索引 map((book,index)=>{})
。请注意,如果您的代码中有多个地图,实际上在您的整个应用程序中,这种方法可能会失败,因为会有更多组件具有相同的键 属性.
所以我建议您使用带有防止重复前缀的密钥。例如
books.map((book, idx)=><Book key={`book_${idx}`} />)
默认情况下这种方法不安全,因此您需要确保不会生成具有相同键的元素。
您好像漏掉了括号。
如果你想使用项目索引作为键,你可以尝试:
{result.map((book, index) => <div key={index} ...>...</div>)}
但是,不建议对键使用索引。最好使用数据中的 ID 作为键。
有关此的更多信息:Index as a key is an anti-pattern。
React.Children.toArray 解决了这个问题,因为它将 children 的键分配给自己。这样做
{React.Children.toArray(
result.map(book => (
<div className="col-md-3 mb-5">
<div className="card card-body bg-light text-center h-100">
<img className="w-100 mb-2" src={book.volumeInfo.imageLinks !== undefined ? book.volumeInfo.imageLinks.thumbnail : ''} alt={book.title} />
<h3 className="text-dark card-title">{book.volumeInfo.title}</h3>
<h5 className="text-dark card-title">{book.volumeInfo.authors}</h5>
</Link>
</div>
</div>
)))}
最好的方法是使用书籍的唯一键 (ID)。例如,如果您要删除书籍,可能会出现问题。
我不知道你的 API 实现,但它可能看起来像这样:
{result.map(book => (
<div className="col-md-3 mb-5" key={book.id}>
<div className="card card-body bg-light text-center h-100">
<img className="w-100 mb-2" src={book.volumeInfo.imageLinks !== undefined ? book.volumeInfo.imageLinks.thumbnail : ''} alt={book.title} />
<h3 className="text-dark card-title">{book.volumeInfo.title}</h3>
<h5 className="text-dark card-title">{book.volumeInfo.authors}</h5>
</Link>
</div>
</div>
))}
如何在此代码中传递密钥?
{result.map(book, key =>
我卡在这里了。我试了好几次都不行!
{
result.map(book => (
<div className="col-md-3 mb-5">
<div className="card card-body bg-light text-center h-100">
<img className="w-100 mb-2" src={book.volumeInfo.imageLinks !== undefined ? book.volumeInfo.imageLinks.thumbnail : ''} alt={book.title} />
<h3 className="text-dark card-title">{book.volumeInfo.title}</h3>
<h5 className="text-dark card-title">{book.volumeInfo.authors}</h5>
</Link>
</div>
</div>
))
}
Key 属性 必须是唯一的,以免破坏 React 规则。所以我建议你使用 book.id 如果它有 属性 或数组索引 map((book,index)=>{})
。请注意,如果您的代码中有多个地图,实际上在您的整个应用程序中,这种方法可能会失败,因为会有更多组件具有相同的键 属性.
所以我建议您使用带有防止重复前缀的密钥。例如
books.map((book, idx)=><Book key={`book_${idx}`} />)
默认情况下这种方法不安全,因此您需要确保不会生成具有相同键的元素。
您好像漏掉了括号。
如果你想使用项目索引作为键,你可以尝试:
{result.map((book, index) => <div key={index} ...>...</div>)}
但是,不建议对键使用索引。最好使用数据中的 ID 作为键。
有关此的更多信息:Index as a key is an anti-pattern。
React.Children.toArray 解决了这个问题,因为它将 children 的键分配给自己。这样做
{React.Children.toArray(
result.map(book => (
<div className="col-md-3 mb-5">
<div className="card card-body bg-light text-center h-100">
<img className="w-100 mb-2" src={book.volumeInfo.imageLinks !== undefined ? book.volumeInfo.imageLinks.thumbnail : ''} alt={book.title} />
<h3 className="text-dark card-title">{book.volumeInfo.title}</h3>
<h5 className="text-dark card-title">{book.volumeInfo.authors}</h5>
</Link>
</div>
</div>
)))}
最好的方法是使用书籍的唯一键 (ID)。例如,如果您要删除书籍,可能会出现问题。
我不知道你的 API 实现,但它可能看起来像这样:
{result.map(book => (
<div className="col-md-3 mb-5" key={book.id}>
<div className="card card-body bg-light text-center h-100">
<img className="w-100 mb-2" src={book.volumeInfo.imageLinks !== undefined ? book.volumeInfo.imageLinks.thumbnail : ''} alt={book.title} />
<h3 className="text-dark card-title">{book.volumeInfo.title}</h3>
<h5 className="text-dark card-title">{book.volumeInfo.authors}</h5>
</Link>
</div>
</div>
))}