映射数组时如何为 React 子项指定键
How to specify a key for React children when mapping over an array
我在 React 联系人列表组件中有一个方法,我在其中返回另一个组件。我已经让它工作了,但很好奇是否有更好的方法来构建我使用密钥的方式。
具体来说 - 我从下面的方法中询问这一行代码(数据被硬编码为示例以开始):
return <ShortContact contact={contact} key={contact.id}/>
这是上下文中的代码:
_getContacts() {
let contactList = [
{
id: 1,
fName: "aaa",
lName: "aaaaa",
imgUrl: "http://brainstorminonline.com/wp-content/uploads/2011/12/blah.jpg",
email: "aaa@aaaa.com",
phone: "999999999999"
},
{
id: 2,
fName: "bbbbb",
lName: "bbbbbbb",
imgUrl: "https://media.licdn.com/mpr/mpr/shrinknp_200_200/bbb.jpg",
email: "bbb@bbb-bbb.com",
phone: "888888888888"
},
{
id: 3,
fName: "Number",
lName: "Three",
imgUrl: "http://3.bp.blogspot.com/-iYgp2G1mD4o/TssPyGjJ4bI/AAAAAAAAGl0/UoweTTF1-3U/s1600/Number+3+Coloring+Pages+14.gif",
email: "three@ccccc.com",
phone: "333-333-3333"
}
];
return contactList.map((contact) => {
"use strict";
return <ShortContact contact={contact} key={contact.id}/>
});
}
ShortContact 组件渲染:
class ShortContact extends React.Component {
render() {
return (
<div >
<li className="contact-short well whiteBG">
<img className="contact-short-thumb" src={this.props.contact.imgUrl}/>
<p className="contact-short-name">{this.props.contact.fName}</p><br />
<p className="contact-short-email">{this.props.contact.email}</p>
</li>
</div>
);
}
}
我为如何让它工作而没有收到警告而苦苦挣扎Warning: Each child in an array or iterator should have a unique "key" prop.
但是我想知道语法或结构是否有效以及是否应该重构它。
这段代码没有任何问题。密钥是必需的,以便 React 知道如何渲染子节点。事实上你的实现正是 react 要求程序员做的。现在可以更改使用哪个密钥等细节,但看起来您已经有了最高效的解决方案。
主要要求是密钥是唯一的,因此只要 contact.id 始终是唯一的(如果它来自数据库,那么它将是唯一的)那么就可以了。
或者,您可以在地图上使用索引作为键,但我真的不推荐这样做(我将在下面的代码片段后进行解释)。
contactList.map((contact, i) => {
return <ShortContact contact={contact} key={i}/>
});
我个人认为您的方法是最好的方法,因为它可以防止额外的渲染。我的意思是,例如,当从服务器返回一个新联系人时,每个联系人行都将被重新呈现,因为每个联系人在数组中的索引是不同的(假设您没有将其视为堆栈)...在该索引处具有新联系人数据的不同索引将导致重新呈现。因为 contact.id 是一个静态数字,如果该联系人的数据未更改,则 React 不会重新呈现它。
需要使用唯一键。在您的示例中,使用 id 是理想的。有关详细信息,请参阅以下内容:
我在 React 联系人列表组件中有一个方法,我在其中返回另一个组件。我已经让它工作了,但很好奇是否有更好的方法来构建我使用密钥的方式。
具体来说 - 我从下面的方法中询问这一行代码(数据被硬编码为示例以开始):
return <ShortContact contact={contact} key={contact.id}/>
这是上下文中的代码:
_getContacts() {
let contactList = [
{
id: 1,
fName: "aaa",
lName: "aaaaa",
imgUrl: "http://brainstorminonline.com/wp-content/uploads/2011/12/blah.jpg",
email: "aaa@aaaa.com",
phone: "999999999999"
},
{
id: 2,
fName: "bbbbb",
lName: "bbbbbbb",
imgUrl: "https://media.licdn.com/mpr/mpr/shrinknp_200_200/bbb.jpg",
email: "bbb@bbb-bbb.com",
phone: "888888888888"
},
{
id: 3,
fName: "Number",
lName: "Three",
imgUrl: "http://3.bp.blogspot.com/-iYgp2G1mD4o/TssPyGjJ4bI/AAAAAAAAGl0/UoweTTF1-3U/s1600/Number+3+Coloring+Pages+14.gif",
email: "three@ccccc.com",
phone: "333-333-3333"
}
];
return contactList.map((contact) => {
"use strict";
return <ShortContact contact={contact} key={contact.id}/>
});
}
ShortContact 组件渲染:
class ShortContact extends React.Component {
render() {
return (
<div >
<li className="contact-short well whiteBG">
<img className="contact-short-thumb" src={this.props.contact.imgUrl}/>
<p className="contact-short-name">{this.props.contact.fName}</p><br />
<p className="contact-short-email">{this.props.contact.email}</p>
</li>
</div>
);
}
}
我为如何让它工作而没有收到警告而苦苦挣扎Warning: Each child in an array or iterator should have a unique "key" prop.
但是我想知道语法或结构是否有效以及是否应该重构它。
这段代码没有任何问题。密钥是必需的,以便 React 知道如何渲染子节点。事实上你的实现正是 react 要求程序员做的。现在可以更改使用哪个密钥等细节,但看起来您已经有了最高效的解决方案。
主要要求是密钥是唯一的,因此只要 contact.id 始终是唯一的(如果它来自数据库,那么它将是唯一的)那么就可以了。
或者,您可以在地图上使用索引作为键,但我真的不推荐这样做(我将在下面的代码片段后进行解释)。
contactList.map((contact, i) => {
return <ShortContact contact={contact} key={i}/>
});
我个人认为您的方法是最好的方法,因为它可以防止额外的渲染。我的意思是,例如,当从服务器返回一个新联系人时,每个联系人行都将被重新呈现,因为每个联系人在数组中的索引是不同的(假设您没有将其视为堆栈)...在该索引处具有新联系人数据的不同索引将导致重新呈现。因为 contact.id 是一个静态数字,如果该联系人的数据未更改,则 React 不会重新呈现它。
需要使用唯一键。在您的示例中,使用 id 是理想的。有关详细信息,请参阅以下内容: