我有一个警告:数组或迭代器中的每个子节点都应该有一个唯一的“键”支柱。 但我用了一把钥匙。 这是我的代码:
return (
<li onClick={this.handleOnMarkAsCompleted} key={Date.now()}>
{ completed ? <b>{value}</b> : value }
</li>
)
任何想法?为什么会这样?
答案 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')
);
答案 3 :(得分:-1)
您可以使用数组的索引或对象行的键
Date.now重复