React中的列表渲染与key

React 列表渲染中 key 的作用、稳定身份的重要性与常见误区。

#tech / dev / frame #resource / react #type / concept #status / growing

[!info] related notes

React中的列表渲染与key

React 列表渲染里最重要的不只是 map(),而是 keykey 不是语法附属品,而是节点身份信息。

一句话定义

key 帮助 React 在前后两次渲染之间识别“谁还是谁”,从而更安全地复用和更新列表节点。

为什么它这么重要

如果没有稳定 key,React 在比较列表时就更难判断某个节点是“同一个元素的变化”,还是“另一个元素替换了它”。

一个最典型的例子

{items.map(item => (
  <input key={item.id} defaultValue={item.name} />
))}

这里 key={item.id} 的意义不是语法要求,而是告诉 React:每个输入框都和哪条业务数据绑定。

如果这里改成 key={index},一旦头部插入一项,后面节点就更容易错位复用。

最常见的后果

  • 输入框内容错位
  • 局部状态复用错乱
  • 动画和 DOM 更新异常

为什么不推荐随便用 index

当列表存在插入、删除、排序时,index 代表的位置会变,但节点真实身份并没有跟着稳定下来,于是 React 就可能复用错对象。

什么时候 key 才算好

  • 稳定
  • 唯一
  • 能代表这条业务数据本身

一个更工程化的结论

key 的问题本质是“节点身份设计”,不是“列表语法细节”。

所以:

  • 如果数据有业务 id,就优先用业务 id
  • 如果列表会排序、插入、删除,就更不要随便用 index
  • 只有在列表顺序绝对固定、没有局部状态时,index 风险才相对小

最短记忆方式

key 不是给 React 消除警告用的,而是给节点建立身份用的。

创建于 2026/3/19 更新于 2026/5/27