key 是 React 在列表 diff 时识别节点身份的标识。有了 key,React 才能把旧列表的节点与新列表正确对应:key 相同且类型相同则复用 DOM 节点并只更新变化的属性;没有 key 时 React 默认按位置(索引)逐个对比。
用 index 作 key 的问题:当列表是静态的、只追加、无内部状态时,index 作 key 没问题。但一旦发生中间插入、删除或重排,index 与数据的对应关系会错位:React 会错误复用 DOM 节点和组件内部状态(比如输入框内容、选中状态"串行"到别的行),还会把本可"移动节点"的操作退化成大量属性更新,性能变差且可能产生难以排查的 bug。
实践建议:优先用数据中的稳定唯一 id;没有 id 时可用内容哈希;实在没有再用 index,但仅限纯展示、顺序不变的列表。追问方向:为什么 key 不能通过 props.key 在组件内读取、key 变化导致的组件重挂载应用场景(如强制重置表单)。