李的反应键

时间:2018-05-23 11:34:41

标签: reactjs

我有一个警告:数组或迭代器中的每个子节点都应该有一个唯一的“键”支柱。 但我用了一把钥匙。 这是我的代码:

return (
  <li onClick={this.handleOnMarkAsCompleted} key={Date.now()}>
    { completed ? <b>{value}</b> : value }
  </li>
)

任何想法?为什么会这样?

4 个答案:

答案 0 :(得分:3)

考虑以下两个例子:

const Item = ({ i }) => <li key={i}>li</li>;
const List = ({ data }) => <ul>{data.map((_, i) => <Item i={i} />)}</ul>;

在这种情况下,你会得到:

Warning: Each child in an array or iterator should have a unique "key" prop.

因为li不是数组项。它位于Item内,这是一个数组项。

Item上的关键字可以解决问题:

const Item = ({ i }) => <li key={i}>li</li>;
const List = ({ data }) => <ul>{data.map((_, i) => <Item key={i} />)}</ul>;

代码沙箱:https://codesandbox.io/s/oojwjq0lj6

来自docs

  

键仅在周围数组的上下文中有意义。

     

例如,如果您提取ListItem组件,则应保留该组件   键入数组中的<ListItem />元素而不是<li>   ListItem本身的元素。

关于使用Date.now()

的说明
  

密钥应该稳定,可预测且独特。不稳定的钥匙(如   Math.random()生成的那些将导致许多组件实例   和DOM节点将被不必要地重新创建,这可能会导致   儿童组件的性能下降和丢失状态。

答案 1 :(得分:1)

Date.now()生成当前时间UNIX时间戳,每次都是相同的(在所有项目都呈现的第二个时间段内)。关键必须是唯一的,如错误中所述。添加某种id或(如果没有其他选择)迭代器。

答案 2 :(得分:0)

根据ReactJS文档,Keys只在周围数组的上下文中有意义。 正确使用密钥的示例。

function ListItem(props) {
  // Correct! There is no need to specify the key here:
  return <li>{props.value}</li>;
}

function NumberList(props) {
  const numbers = props.numbers;
  const listItems = numbers.map((number) =>
    // Correct! Key should be specified inside the array.
    <ListItem key={number.toString()}
              value={number} />

  );
  return (
    <ul>
      {listItems}
    </ul>
  );
}

const numbers = [1, 2, 3, 4, 5];
ReactDOM.render(
  <NumberList numbers={numbers} />,
  document.getElementById('root')
);

Try it on codepen

答案 3 :(得分:-1)

您可以使用数组的索引或对象行的键

Date.now重复