在 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 组件,则应保留 键在数组中的 &lt;ListItem /&gt; 元素上,而不是在 &lt;li&gt;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 中反应键的主要内容,如果未能解决你的问题,请参考以下文章

在反应jsx中显示html标记

反应力过渡以在悬停时结束

如何在反应形式中采用默认值

Win10开始菜单按钮右键点击没反应怎么办

尝试使用地图在反应组件中显示键/值对?

win10桌面快捷方式右键属性没反应 然后文件夹右键属性也没反应,怎么解决?