我想在React App中插入一个密钥标识符。当前,我的密钥由Object.name
属性填充。这是不理想的,因为它可能会被复制,然后React
将开始抱怨。服务器不会返回这样的密钥。
因此,我想我将遍历该数组并在我的index
参数中使用key
。所以,这就是我所做的:
const item = itemsList.map((item, index) => ({
...item,
index
}));
并在我的组件中使用它:
<TableWithSearch
keyField="item.index"
data={itemsList}
columns={getItemsTableColumns()}
search
>
我认为这很容易理解。但是后来我的应用崩溃了。出现错误:
Warning: Each child in an array or iterator should have a unique "key" prop.
。
很明显我做错了,但是我一直在看,在过去的1个小时里,仍然无法弄清。
答案 0 :(得分:0)
keyField =“ item.index”不正确。您将其作为字符串传递,这就是为什么您看到该错误的原因。每个元素都获得相同的字符串值“ item.index”
应为keyField = {item.index}
答案 1 :(得分:0)
好吧,经过几个小时的思考,您的评论和答案以及一些实验之后,我找到了解决方案。
为了更彻底地解释解决方案,我将发布我的整个组件:
export class ItemsList extends Component {
static propTypes = {
listItems: PropTypes.func.isRequired
};
componentDidMount() {
const { listItems } = this.props;
listItems();
}
renderGroups() {
const { itemsList, user } = this.props;
const items = itemsList.map((item, index) => ({
...item,
index
}));
return (
<Fragment>
{itemsList.length > 0 ? (
<Fragment>
<PageHeader>
Groups
<span>({itemsList.length})</span>
</PageHeader>
<div className="mb-2">
<TableWithSearch
keyField="index"
data={items}
columns={getItemsTableColumns()}
search
>
</TableWithSearch>
</div>
</Fragment>
) : (
<div>no items</div>
)}
</Fragment>
);
}
我的错误是我将ListGroups
作为数据属性进行传递,这反过来使得该组件完全不可能读取groups数组并获取其索引Ids van der Zee
他的评论。
由于某些原因,键属性上的JSX
语法不符合你们的建议。我尚未对此进行调查,但是我会在下面发表评论。
以上示例的工作原理很吸引人。如果您知道为什么JSX语法不起作用,请随时发表评论。感谢您的帮助。