React使用UUID作为key仍报Each child需唯一key prop错误,求解决
解决React列表"Each child in a list should have a unique 'key' prop"报错
问题根源
你遇到的报错,核心原因是**map迭代返回的最外层元素(即你使用的<>短语法Fragment)没有添加唯一key**。React要求列表中每个被迭代生成的顶级元素必须拥有唯一key,而非仅给内层子元素加key——你给两个Dropdown.Item加了key,但这并不能满足React对列表项顶级元素的key要求。
另外,报错指向<Dropdown.Menu>是React的常见提示逻辑:它会把列表容器元素作为报错位置,而非直接指向缺失key的迭代元素。
解决方案
给迭代的顶级Fragment添加唯一
key
将短语法<>替换为完整的<React.Fragment>,并为其添加key。优先使用数据中已有的唯一标识(比如你数组里的item[0],值为0、1、2,完全唯一),而非uuid.v4()——后者每次渲染都会生成新值,会导致React频繁重渲染列表项,影响性能。修改后的代码示例:
<Dropdown.Menu variant="dark"> { [ [0, "prod_name", "Name"], [1, "price", "Price"], [2, "average_rating", "Rating"], ].map((item, i) => ( <React.Fragment key={item[0]}> <Dropdown.Item as={Button} onClick={() => { this.setState({ sort: item[0], open: false }); this.context.sort(item[1], "asc"); }} className={ this.state.sort === item[0] ? "text-black giBold active" : "text-light" } > {item[2] + " (ascending)"} </Dropdown.Item> <Dropdown.Item as={Button} onClick={() => { this.setState({ sort: item[0] + 3, open: false }); this.context.sort(item[1], "desc"); }} className={ this.state.sort === item[0] + 3 ? "text-black giBold active" : "text-light" } > {item[2] + " (descending)"} </Dropdown.Item> </React.Fragment> )) } </Dropdown.Menu>避免使用
uuid.v4()作为列表项key
动态生成的uuid会在每次组件渲染时改变,React会因此判定所有列表项都是新元素,触发不必要的卸载和重新挂载,降低组件性能。使用数据本身的唯一标识(如item[0])或稳定的索引(仅当列表不会重新排序时)是更优选择。
内容的提问来源于stack exchange,提问作者Rebecca
相关产品推荐
相关产品推荐

