用途:为 React 列表渲染和组件重挂载提供稳定的条目身份(key),避免使用渲染位置相关的 key。
主要规则:始终为渲染的列表项添加 key;优先使用数据中唯一且稳定的 ID;若数据缺少 ID,应在数据创建或加载时一次性生成,而非在渲染过程中生成;同一项存在期间应保持同一个 key。禁止使用 Math.random()、Date.now() 或 useId() 作为列表 key;动态列表应避免使用数组索引作为 key。
示例写法:{todos.map((todo) => (<li key={todo.id}>{todo.text}</li>))}。
缺失 ID 处理:在渲染前一次性创建 ID,例如 const itemsWithIds = data.map((item) => ({ ...item, id: crypto.randomUUID() }));。
索引例外:仅当列表静态、不会在中间插入或删除、顺序不变、项目无内部状态时,才可使用索引作为 key。
失效场景:索引代表位置,顺序变化时 React 会复用错误的组件,导致过期状态、错误输入值、动画损坏或意外焦点。
参考:React 官方文档的 Rendering Lists 章节,以及 nanoid。输出应包含稳定 key 的选择、数据缺少 ID 时的说明,以及对索引、随机值、日期或 useId 作为 key 的修复建议。