在 li 中反应键
Posted
技术标签:
【中文标题】在 li 中反应键【英文标题】:React key in li 【发布时间】:2018-11-02 09:14:16 【问题描述】:我有一个警告:数组或迭代器中的每个孩子都应该有一个唯一的“key”道具。 但我用了一把钥匙。 这是我的代码:
return (
<li onClick=this.handleOnMarkAsCompleted key=Date.now()>
completed ? <b>value</b> : value
</li>
)
有什么想法吗?为什么会这样?
【问题讨论】:
我猜是放错地方了。呈现这些 li-s 的列表组件应该将 key 传递给每个 li。 Getting key prop warning in React, even though key is set的可能重复 Understanding unique keys for array children in React.js的可能重复 【参考方案1】:考虑这两个例子:
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 节点被不必要地重新创建,这可能导致 子组件的性能下降和丢失状态。
【讨论】:
数组索引作为键通常是一个坏主意,因为数组可以排序/过滤/更改,然后与项目关联的索引不再映射,导致与您提到的不稳定键相同的问题。【参考方案2】:Date.now() 生成当前时间 UNIX 时间戳,每次都相同(在所有项目都被渲染的秒内)。键需要是唯一的,如错误中所述。添加某种 id 或(如果没有其他选择)一个迭代器。
【讨论】:
我用 Math.random() 试过了,你能给点建议吗? 你能用整个sn-p代码更新问题吗?这个返回值在哪里使用,是在map函数中吗?【参考方案3】:根据 ReactJS 文档,键仅在周围数组的上下文中才有意义。 正确使用密钥的示例。
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
【讨论】:
【参考方案4】:您可以使用数组的索引或对象行的键
Date.now 重复
【讨论】:
是什么的副本?顺便说一句,不建议使用数组索引作为键。以上是关于在 li 中反应键的主要内容,如果未能解决你的问题,请参考以下文章