我正在构建一个接受 JSON 数据源并创建可排序表的 React 组件。
每个动态数据行都有一个分配给它的唯一键,但我仍然收到以下错误:
数组中的每个孩子都应该有一个唯一的“关键”道具。
检查 TableComponent 的渲染方法。
我的 TableComponent
渲染方法返回:
<table>
<thead key="thead">
<TableHeader columns={columnNames}/>
</thead>
<tbody key="tbody">
{ rows }
</tbody>
</table>
TableHeader
组件是单行,并且还分配有一个唯一键。
row
rows
由具有唯一键的组件构建的:
<TableRowItem key={item.id} data={item} columns={columnNames}/>
TableRowItem
看起来像这样:
var TableRowItem = React.createClass({
render: function() {
var td = function() {
return this.props.columns.map(function(c) {
return <td key={this.props.data[c]}>{this.props.data[c]}</td>;
}, this);
}.bind(this);
return (
<tr>{ td(this.props.item) }</tr>
)
}
});
是什么导致了唯一键道具错误?
原文由 Brett DeWoody 发布,翻译遵循 CC BY-SA 4.0 许可协议
您应该为每个 child 以及 children 中的每个元素 添加一个键。
这种方式 React 可以处理最小的 DOM 更改。
在您的代码中,每个
<TableRowItem key={item.id} data={item} columns={columnNames}/>
都试图在没有键的情况下在其中呈现一些子项。检查 这个例子。
尝试从 div 内的
<b></b>
元素中删除key={i}
(并检查控制台)。在示例中,如果我们没有为
<b>
元素提供键并且我们 只想 更新object.city
,那么 React 需要重新渲染整行而不是元素。这是代码:
@Chris 在底部发布的答案 比这个答案更详细。
React 文档中关于键在对账中的重要性: Keys