为什么在使用片段时可以避免使用键,但在使用数组时不能
Why can I avoid using keys when using fragments but not when using arrays?
>我在这里举了一个例子:http://jsbin.com/divubozaha/edit?js,console,output
基本上,这没有任何警告:
<div>
<h1>test1</h1>
{Math.random() > 0.5 ? <h1>test1</h1> : null}
<h1>test1</h1>
</div>
(即使某些孩子可以重新订购。
但这引发了臭名昭著的Each child in an array or iterator should have a unique "key" prop.
:
<div>{[
<h1>test2</h1>,
<h1>test2</h1>,
<h1>test2</h1>
]}</div>
因此,在过滤元素的子元素时,我有警告。也许片段中有某种隐式键?
隐式键是元素相对于其同级元素的显示顺序。 即 0, 1, 2...你可以在 React 开发工具中看到这一点:它是 data-reactid
属性的最后一位数字。
key
的目的是优化虚拟 DOM 差异。数组的问题在于它们是动态的。如果你有一个数组生成元素 [ A, B, C, D, E ],然后删除第一项,你的新元素就变成了 [ B, C, D, E]。然后 React 会将 B 与 A、C 与 B、D 与 C、E 与 D 进行比较,并更改每个节点。
相反,如果你提供一个键来唯一地标识每个元素,React 将知道 A 已被删除,然后将 B 与 B、C 与 C、D 与 D 以及 E 与 E 进行比较。这允许更有效的 DOM 更改。
React 会生成此警告,因为它知道隐式数组键有多不可靠。它要求您提供一些优化帮助。您的第一个代码段也是不可靠的隐式键的示例。但这更像是一种边缘情况。
我找到了一个解决方案:只需使用React.children.map来过滤子级。
喜欢这个:
var children = React.Children.map(this.props.children, child => {
return child.props.to_be_filtered ? null : child;
});
然后直接<div>{children}</div>
。
您还可以通过以下方式转换它们:
var children = React.Children.map(this.props.children, child => {
return <li>child</li>;
});
没有任何缺少密钥:D的警告(使您的 API 更简单)
- 我需要迭代一个JSON数组——不知道如何做到——已经搜索过了,但仍然可以'我一点也不知道
- 通过AJAX从具有LazyLoadingEnabled=true的EF返回的数组不正确
- For循环与数组不起作用
- Lodash 从与值数组不匹配的数组中获取项目
- 循环浏览页面上所有选中的复选框并将id拉入数组不起作用
- 文本框搜索/Javascript函数数组**不对应**
- AngularStrap Select和ng选项don'使用动态数组不能很好地工作
- 数组不能从变量中获取值
- 使用带有jquery/javascript的for循环创建动态数组不能访问外部或不能访问全局
- 创建由每个子数组的最大值组成的数组不能按预期工作
- Javascript中的多维数组:不能设置属性'0'的定义
- 如果使用if else语句,数组不能正常工作
- PHP数组不能存储变量
- 为什么我的比较数组不能工作?
- 数组不能访问元素
- 为什么图像数组不能在HTML5 Canvas中绘制
- Javascript数组不能作为数组访问
- 关联数组不能与eval() JavaScript一起工作
- 图像数组不能绘制到画布上
- JavaScript多维数组不能作为数组访问,只能作为字符串访问