You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React数组子元素无唯一key报错问题求助

解决React "Each child in an array or iterator should have a unique 'key' prop" 报错

嘿,我明白你现在的困惑——明明已经加了key,怎么还会报这个错?其实问题出在React对key的要求位置上,咱们一步步理清楚:

首先得搞懂React key的核心逻辑:key必须绑定在数组循环生成的最外层组件/元素上,而不是子组件内部的元素。你现在把key放在Book组件里的<li>上,这其实没起到React需要的作用——因为React是在ListBooks组件里循环渲染Book实例的时候,把每个Book当成了数组的直接子元素,这时候才需要给每个Book加key,而不是Book内部的<li>。

具体修改方法

假设你的ListBooks组件里原本是这么渲染Book的:

// 错误写法:只在Book内部加了key,循环的Book本身没加
render() {
  return (
    <ul>
      {this.props.books.map(book => (
        <Book book={book} /> // 这里才是数组循环的子元素,必须加key
      ))}
    </ul>
  )
}

你需要把key移到循环渲染Book的位置,改成这样:

// 正确写法:在循环生成的Book组件上绑定key
render() {
  return (
    <ul>
      {this.props.books.map(book => (
        <Book 
          key={book.id} // 把key放在这里!这才是React能识别的位置
          book={book} 
        />
      ))}
    </ul>
  )
}

改完之后,你可以把Book组件里<li>的key去掉了,因为它已经不是数组循环的直接子元素,不需要重复加key。

额外排查点

如果改完还是报错,你可以检查这几点:

  • 确认book.id确实是全局唯一的,没有重复值(可以在ListBooks的循环里打印book.id验证)
  • 确保你循环的是标准数组,不是其他特殊可迭代对象(比如Set转数组时要注意处理)
  • 尽量别用数组索引index当key,除非你的数组是完全静态、不会排序/增删的(用index当key会导致元素顺序变化时的DOM更新错误和性能问题)

内容的提问来源于stack exchange,提问作者Robinj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:38:13