当前位置: 首页 > 知识库问答 >
问题:

在React中获取钥匙道具警告,即使钥匙已设置

赖运珧
2023-03-14

我收到这个警告:

警告:数组或迭代器中的每个子级都应具有唯一的“键”属性。检查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子级:

我非常困惑。为什么我会收到警告?


共有3个答案

百里杰
2023-03-14

我意识到这个帖子很老了,但我刚刚遇到了这个问题,这让我发疯。当我意识到我有一个

商勇
2023-03-14

每次呈现列表(使用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的新元素,因为我们拥有所有其他键,这些键没有更改。如果没有钥匙,这一切都会变得模糊不清。

从现在开始,很容易看到:

  • 为什么键应该是唯一的,但只在列表中的兄弟姐妹之间是重要的,因为比较只发生在给定列表的旧元素和新元素中。
  • 前一个版本和新版本之间的相同元素的键应该保持不变,否则我们会比较不同的元素,并且无法跟踪更改。这就是为什么建议使用资源的id,或者(如果没有)元素独有的其他数据,以及为什么不应该使用诸如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) => {

本文中还有一个很好的例子。

陈马鲁
2023-03-14

您是否尝试将键添加到

         <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