React cloneElement not setting key

Jor*_*dan 7 javascript reactjs

我正在构建一个动态生成密钥的表控件(我理解这可能不是一个好主意 - 我想密钥应该与它所代表的数据唯一关联,否则React可能只为我们生成唯一的ID?),但无论哪种方式似乎钥匙没有设置,我不知道为什么.表中的行是使用可在此处找到的函数生成的.基本上我有一个辅助组件,它使用一个可选组件来转换所有子元素 - 这里是其中一个转换函数(来自TableBody组件):

const transformRows = (keyPrefix) => (children, passthroughProps) => (React.Children.map(children, (c, i) => {
    return React.cloneElement(c, {
        key: `${keyPrefix}-${i}`,
        style: rowStyle,
        className: rowClassName,
        columnDefinitions: columnDefinitions,
        rowData: tableData[i],
        includeVerticalScrollbar,
        ...passthroughProps
    });
}));
Run Code Online (Sandbox Code Playgroud)

奇怪的是,当我单步执行代码时,似乎正在分配密钥,但随后我在浏览器中收到一条警告,该警告会在堆栈跟踪中Each child in an array or iterator should have a unique "key" prop追溯到此处.

有任何想法吗?

Izh*_*aki 9

克服这个问题的一种方法是用每个克隆元素包装React.Fragment并在后者上设置键。

像这样:

  <>
    {connections.map(connection => (
      <React.Fragment key={connection.id}>
        {React.cloneElement(element, connection)}
      </React.Fragment>
    ))}
  </>

Run Code Online (Sandbox Code Playgroud)


Vel*_*uha 6

来自文档React.cloneElement

与React.addons.cloneWithProps不同,将保留原始元素的key和ref.

因此,如果您为Cell设置密钥,则每个克隆都会自动获取密钥.