我正在构建一个React组件,它接受JSON数据源并创建一个可排序的表。
每个动态数据行都有一个唯一的键分配给它,但我仍然得到一个错误:
数组中的每个子元素都应该有一个唯一的“key”道具。
检查TableComponent的渲染方法。
我的TableComponent渲染方法返回:
<table>
<thead key="thead">
<TableHeader columns={columnNames}/>
</thead>
<tbody key="tbody">
{ rows }
</tbody>
</table>
TableHeader组件是单行,也有一个唯一的键赋给它。
行中的每一行都是由一个具有唯一键的组件构建的:
<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>
)
}
});
是什么导致唯一键道具错误?
您应该为tbody where的每个子键使用唯一的值
该值不能与其同级值相同
不应该在渲染之间改变
例如,键值可以是数据库id或UUID(通用唯一标识符)。
这里的键是手动处理的:
<tbody>
{rows.map((row) => <ObjectRow key={row.uuid} />)}
</tbody>
你也可以让React使用React. children . toarray来处理键
<tbody>
{React.Children.toArray(rows.map((row) => <ObjectRow />))}
</tbody>
如果我们有数组对象数据。然后我们绘制地图来显示数据。并传递唯一的id (key = {product。Id})因为浏览器可以选择唯一的数据。
example : [
{
"id": "1",
"name": "walton glass door",
"suplier": "walton group",
"price": "50000",
"quantity": "25",
"description":"Walton Refrigerator is the Best Refrigerator brand in bv
Bangladesh "
},
{
"id": "2",
"name": "walton glass door",
"suplier": "walton group",
"price": "40000",
"quantity": "5",
"description":"Walton Refrigerator is the Best Refrigerator brand in
Bangladesh "
},
}
现在我们映射数据并传递唯一id:
{
products.map(product => <product product={product} key={product.id}
</product>)
}
您应该为每个子元素以及子元素中的每个元素添加一个键。
这样React就可以处理最小的DOM更改。
在代码中,每个<TableRowItem key={项。id} data={item} columns={columnNames}/>试图在其中呈现一些没有键的子元素。
请看这个例子。
尝试从div的<b></b>元素中删除key={i}(并检查控制台)。
在本例中,如果我们没有给<b>元素一个键,并且我们只想更新对象。在city中,React需要重新渲染整个行,而不仅仅是元素。
代码如下:
const data = [
{ name: "Nuri", age: 28, city: "HO" },
{ name: "Talib", age: 82, city: "HN" },
{ name: "Jenny", age: 41, city: "IT" },
];
const ExampleComponent = React.createClass({
render: function () {
const infoData = this.props.info;
return (
<div>
{infoData.map((object, i) => {
return (
<div className={"row"} key={i}>
{[
object.name,
// remove the key
<b className="fosfo" key={i}>
{" "}
{object.city}{" "}
</b>,
object.age,
]}
</div>
);
})}
</div>
);
},
});
React.render(<ExampleComponent info={data} />, document.body);
下面由@Chris发布的答案比这个答案更详细。
React文档中关于按键在协调中的重要性:按键
我认为在处理表(或类似的例子)时,为了重用性,应该将创建的唯一键从父组件传递给子组件。
因为如果你正在创建一个表,这意味着你正在从父表传递数据。如果你赋值key={row.name},可能当前数据有name属性,但如果你想在其他地方使用这个表组件,你假设在你传递的每一行数据中,你都有name属性。
由于工程师将在父组件中准备数据,因此工程师应该基于这些数据创建一个键函数。
const keyFunc = (student) => {
return student.id;
};
在这种情况下,工程师知道它正在发送什么数据,它知道每一行都有唯一的id属性。也许在不同的数据集中,数据集是股票价格它没有id属性,只有符号
const keyFunc = (stock) => {
return stock.symbol;
};
这个keyFunc应该作为道具传递给子组件,以保证可重用性和唯一性。