如何在映射数组时为React子项指定键

时间:2016-05-02 02:45:45

标签: arrays reactjs key

我在一个反应​​联系人列表组件中有一个方法,我将返回另一个组件。我有它的工作,但我很好奇,如果有一个更好的方法来构建我如何使用密钥。

具体来说 - 我从下面的方法询问这行代码(数据被硬编码为开始的样本):

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 Component Render:

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.时遇到了困难但是我想知道语法或结构是否有效以及是否应该重构。

2 个答案:

答案 0 :(得分:4)

此代码没有任何问题。密钥是必需的,以便react知道如何呈现子节点。实际上,您的实现正是程序员要做的反应。现在可以更改使用哪个键等的详细信息,但看起来您已经拥有了最高性能的解决方案。

主要要求是密钥是唯一的,因此只要contact.id始终是唯一的(如果它来自数据库,那么它就是),那么你很好。

或者您可以在地图上使用索引作为密钥,但我不会真的推荐它(我会在下面的代码片段后解释)。

contactList.map((contact, i) => {
    return <ShortContact contact={contact} key={i}/>
});

我个人认为你的方法是最好的方法,因为它可以防止额外的渲染。我的意思是,例如当从服务器返回一个新的联系人时,每个联系人行将被重新呈现,因为每个联系人的数组中的索引是不同的(假设你没有像堆栈一样对待它)...在该索引处具有新联系人数据的不同索引将导致重新呈现。因为如果该联系人的数据没有改变,contact.id是一个静态数字,那么反应就不会重新呈现它。

答案 1 :(得分:0)

需要使用唯一密钥。在您的示例中,使用id是理想的。有关更多信息,请参阅以下内容:

https://facebook.github.io/react/docs/lists-and-keys.html