假设一个Row
组件,你会Row
为外部的每个回调返回一个map
,就像这样(我把它们放在一个假设中Container
只是为了上下文):
<Container>
{this.state.data.amp((item, index) =>
<Row key={index}>
{Object.entries(item).map(([key, value]) =>
<Column field={key} header={key} key={key}>{value}</Column>
)}
</Row>
)}
</Container>
注意我已经添加了key
属性,因为这些是数组。(将索引用于key
onRow
不太理想。如果item
对象具有可以使用的某些唯一属性,那会更好。如果数组在组件生命周期中从不更改,则使用索引很好,但如果确实如此,它可能导致糟糕的渲染。更多关于React 文档的内容。)
但是,使用Object.entries
onitem
并不理想,因为它依赖于 中属性的顺序item
,尽管 JavaScript 对象确实为其属性提供了顺序,但依赖该顺序通常不是最佳实践,因为顺序并不像看起来,构建看起来像同一个对象但属性顺序不同的对象真的很容易。¹相反,我建议按照您希望它们出现在列中的顺序排列一个属性名称数组,然后使用那个数组:
<Container>
{this.state.data.amp((item, index) =>
<Row key={index}>
{propertyNamesInColumnOrder.map(key =>
<Column field={key} header={key} key={key}>{item[key]}</Column>
)}
</Row>
)}
</Container>
¹ “构建看似相同但属性顺序不同的对象真的很容易”例如:
const obj1 = {a: 1, b: 2};
const obj2 = {b: 2, a: 1};
它们看起来像同一个物体。它们都具有a
和b
属性,并且属性值是相同的。但是属性的顺序不同:obj1
的属性是顺序的a, b
,而obj2
的属性是顺序的b, a
。
但是等等,情况变得更糟:
const obj3 = {"1": "one", "0": "zero"};
const obj4 = {"0": "zero", "1": "one"};
当然,如果obj1
和obj2
的属性顺序不同,那么obj3
和obj4
的属性顺序也不同,对吧?
错误的。
它们的顺序相同,因为名称为规范所称的“数组索引”(数值为 +0 或正整数 Number ≤ 2 32 - 1 的规范数字字符串)的属性始终按数字顺序排列。
然后你把继承的属性扔进去,它会变得更糟。因此,一般来说,避免依赖对象属性顺序。