【问题标题】:Each child should have a unique key error in React每个孩子在 React 中都应该有一个唯一的键错误
【发布时间】:2016-12-16 11:41:30
【问题描述】:

我有一个生成行和标题的表格组件,虽然我认为我在每个 tr 元素上都有一个唯一键,但仍然会出现警告。我已经阅读了其他一些具有相同问题的问题,但仍然无法给出答案……如果有人可以帮助我解决这个问题,我将不胜感激。

这是有问题的代码:

render: function() {
          var headerComponents = this.generateHeaders(),
              rowComponents = this.generateRows();

          return (
              <table>
                  <thead>{headerComponents}</thead>
                  <ReactCSSTransitionGroup transitionName="fade" transitionEnterTimeout={500} transitionLeaveTimeout={300} transitionAppearTimeout={500} transitionAppear={true} component="tbody">
                    {rowComponents}
                  </ReactCSSTransitionGroup>
              </table>
          );

      },

      generateHeaders: function() {
          var cols = this.props.cols;  // [{key, label}]

          // generate our header (th) cell components
          return cols.map(function(colData) {
              return <th key={colData.key}>{colData.label}</th>;
          });
      },

      generateRows: function() {
          var cols = this.props.cols,  // [{key, label}]
              data = this.props.data;

          var propsRound = this.props.round;

          var round=1;
          var pairNo=1;
          var oldRound=0;
          var teamName=null;
          var first=true;
          var delay=100;
          return this.state.data.map(function(item, i) {
              var htmlExcerpt = null;
              var len = Object.keys(cols).length;
              if (oldRound !== item.round) {
                  htmlExcerpt = <tr key={'round'+item.round} style={{ 'transition-delay': `${i * delay}ms` }}><td colSpan={len}>Round: {item.round}</td></tr>;
                  oldRound = item.round;
              }
              var cells = cols.map(function(colData) {
                  if (colData.key == "pairNo") {
                    return (<td> {i+1} </td>);
                  } else {
                    if (colData.key == "homeTeam" || colData.key == "awayTeam") {
                      teamName = config.teams[item[colData.key]].name;
                      return (<td> {teamName} </td>);
                    } else {
                      return (<td> {item[colData.key]} </td>);
                    }
                  }
              });
              if (htmlExcerpt !== null) {
                return [htmlExcerpt,<tr key={'round'+item.round+'_'+item.pairNo} style={{ 'transition-delay': `${i * delay}ms` }}>{cells}</tr>];
              } else {
                return <tr key={'round'+item.round+'_'+item.pairNo} style={{ 'transition-delay': `${i * delay}ms` }}>{cells}</tr>;
              }
              pairNo=pairNo+1;
          });

我相信每个 tr 都有不同的键,但仍然会出现警告...

警告堆栈:

Warning: Each child in an array or iterator should have a unique "key" prop. Check the render method of `exports`. 
in td (created by exports)
in exportswarning @ app.js:23941validateExplicitKey @ app.js:13818validateChildKeys @ app.js:13838createElement @ app.js:13906(anonymous function) @ app.js:24284generateRows @ app.js:24237exports_render @ app.js:24193_renderValidatedComponentWithoutOwnerOrContext @ app.js:9520_renderValidatedComponent @ app.js:9547performInitialMount @ app.js:9071mountComponent @ app.js:8950mountComponent @ app.js:16707performInitialMount @ app.js:9085mountComponent @ app.js:8950mountComponent @ app.js:16707mountComponentIntoNode @ app.js:14824perform @ app.js:20206batchedMountComponentIntoNode @ app.js:14845perform @ app.js:20206batchedUpdates @ app.js:13268batchedUpdates @ app.js:17911_renderNewRootComponent @ app.js:15004_renderSubtreeIntoContainer @ app.js:15090render @ app.js:15111194../StartButton @ app.js:24423s @ app.js:1e @ app.js:1(anonymous function) @ app.js:1

有问题的表的 React 开发者工具...

【问题讨论】:

  • 这个问题仍然存在......但以下答案均无效

标签: reactjs key


【解决方案1】:

如果您粘贴了警告堆栈,那就太好了,但根据我在您的代码中看到的内容,请尝试将密钥放在那里

var cells = cols.map(function(colData) {
              if (colData.key == "pairNo") {
                return (<td key={'someKey}> {i+1} </td>);
              } else {
                if (colData.key == "homeTeam" || colData.key == "awayTeam") {
                  teamName = config.teams[item[colData.key]].name;
                  return (<td key={'someKey}> {teamName} </td>);
                } else {
                  return (<td key={'someKey}> {item[colData.key]} </td>);
                }
              }
          });

【讨论】:

  • 我也添加了警告堆栈...据我所知,您认为我应该将键放在 td 元素而不是 tr 上?
  • 键总是必须在“iterable”元素上——所以在这种情况下,它显然是 ... 或者换句话说——它必须在你返回的元素上你的“地图”功能。如果你实现了一个密钥但仍然收到警告 - 你提供的密钥根本不是唯一的 - 调试你的代码,你会被启发
  • @jebbie 我已经调试过了 :) 我认为这些键是唯一的...我还添加了来自 react 开发人员工具的片段以查看这些键...
  • 好吧,现在它变得超级奇怪 - 当我与这种错误作斗争时,我总是处于这样的情况......我现在没有答案了:D
【解决方案2】:

您在本地增加“pairNo”,但使用 item.pairNo 来制作密钥 - 我猜它会一直保持相同的值...

【讨论】:

  • 当我考虑在生成行时增加它时,该变量仍然存在,但后来我将它移到状态数据中......它不会影响任何东西。
猜你喜欢
相关资源
最近更新 更多
热门标签