我收到这个警告:
警告:数组或迭代器中的每个子级都应具有唯一的“键”属性。检查EventsTable的渲染方法。有关更多信息,请参阅fb.me/react-warning-keys。
react-runtime-dev.js?8fefd85d334323f8baa58410bac59b2a7f426ea7: 21998警告:数组或迭代器中的每个孩子都应该有一个唯一的“键”道具。检查事件的渲染方法。有关更多信息,请参阅fb.me/react-warning-keys。
这是EventsTable
:
EventsTable = React.createClass({
displayName: 'EventsTable',
render() {
console.dir(this.props.list);
return (
<table className="events-table">
<thead>
<tr>
{_.keys(this.props.list[0]).map(function (key) {
if (key !== 'attributes') {
return <th>{key}</th>;
}
})}
</tr>
</thead>
<tbody>
{this.props.list.map(function (row) {
return (
<Event key={row.WhatId} data={row} />
);
})}
</tbody>
</table>
)
}
});
这是事件
:
Event = React.createClass({
displayName: 'Event',
render() {
return (
<tr>
{_.keys(this.props.data).map((x) => {
if (x !== 'attributes')
return <td>{this.props.data[x]}</td>;
})}
</tr>
)
}
});
显然我在
密钥应始终直接提供给数组中的组件,而不是数组中每个组件的容器HTML子级:
我非常困惑。为什么我会收到警告?
我意识到这个帖子很老了,但我刚刚遇到了这个问题,这让我发疯。当我意识到我有一个
每次呈现列表(使用map
)时,向列表元素(从map
的回调返回的最顶层或“根”元素)添加一个唯一的key
属性:
render() {
return (
<div>
{this.props.data.map( element => {
// Place the key on to the returned "root" element.
// Also, in real life this should be a separate component...
return <div key={element.id}>
<span>Id (Name): </span>
<span>{element.id} </span>
<span>({element.name})</span>
</div>;
})}
</div>
)
}
官方列表和关键点文档显示了您应该如何使用列表,链接的对账文档会说明原因。
基本上,当React重新渲染一个组件时,它会运行一个差异算法,找出新版本和旧版本列表之间发生了什么变化。比较并不总是微不足道的,但是如果每个元素中都有一个唯一的键,就可以清楚地识别出发生了什么变化。参见文档中的示例:
<!-- previous -->
<ul>
<li key="2015">Duke</li>
<li key="2016">Villanova</li>
</ul>
<!-- new -->
<ul>
<li key="2014">Connecticut</li>
<li key="2015">Duke</li>
<li key="2016">Villanova</li>
</ul>
很明显,添加了一个带有键2014
的新元素,因为我们拥有所有其他键,这些键没有更改。如果没有钥匙,这一切都会变得模糊不清。
从现在开始,很容易看到:
Math.random()
之类的东西。您应该将键
属性放置到组件的约定是一种更好的做法,因为当您迭代列表并希望呈现元素时,这清楚地表明您应该将代码组织到单独的组件中。
您从文档中引用的声明:
密钥应始终直接提供给数组中的组件,而不是数组中每个组件的容器HTML子级:
这意味着如果在循环中渲染组件,则应设置循环中组件的键
属性,就像在EventsTable
组件中一样:
{this.props.list.map(function (row) {
return (
<Event key={row.WhatId} data={row} />
);
})}
错误的方法是将其传递给组件,在组件上设置键
:
Event = React.createClass({
displayName: 'Event',
render() {
// Don't do this!
return (
<tr key={this.props.data.WhatId}>
{_.keys(this.props.data).map((x) => {
本文中还有一个很好的例子。
您是否尝试将键添加到
<tr>
{_.keys(this.props.list[0]).map(function (key) {
if (key !== 'attributes') {
return <th key={key}>{key}</th>;
}
})}
</tr>
我知道这个问题有很多答案,但我找不到一个能完全解决我问题的答案。我得到以下错误:
我正在研究使用Hibernate 4.1.9注释地图的不同方法 如果我想存储一个Map,其中键是实体值的属性,标记如下所示 请注意,上面的标记不会创建连接表,而是在运行时通过查询返回Map,因此Map是动态的,您不必在map中添加元素Java查询返回它们。 现在,我希望地图的内容反映应用程序添加到地图中的内容,而不是执行动态查询。 我想储存4种不同的地图 在这些情况下,键之间没有关系 我尝试了以下
Targets key To be discussed in order to avoid _Warning: potential malicious behavior - trust data has insufficient signatures for remote repository .dkr.ecr.us-east-1.amazonaws.com/app: valid signatur
Snapshot key To rotate the snapshot key: ❯ notary -D -v -s https://127.0.0.1:4443 -d ~/.docker/trust key rotate <aws_account_id>.dkr.ecr.us-east-1.amazonaws.com/app snapshot -r Enter passphrase for ne
我的控制台出现错误, 我的JSON在这里https://dev.justinblayney.com/wp-content/uploads/2020/12/main-menu.json_.zip 警告:列表中的每个孩子都应该有一个唯一的“键”道具。 在我的页面上显示的是(所以他们都是独一无二的,所以WTF反应) 钥匙:2429钥匙:2430钥匙:3859钥匙:2421钥匙:2802钥匙:2428 另
Timestamp key The timestamp key can also be rotated: ❯ notary -D -v -s https://127.0.0.1:4443 -d ~/.docker/trust key rotate <aws_account_id>.dkr.ecr.us-east-1.amazonaws.com/app timestamp -r Enter the