2026-10-25 09:13:20
在 React 中,列表渲染需要添加 key 属性,主要原因与 React 的 DOM Diff 算法优化 和 节点复用逻辑 密切相关。以下是详细解释:
1. 为什么需要 key?React 通过 虚拟 DOM(Virtual DOM) 的差异对比(Diff 算法)来高效更新真实 DOM。当列表中的节点位置发生变化时,key 的作用如下:
低效的复用逻辑:若节点位置变化,React 会销毁旧节点并重建新节点,而非直接移动节点。
状态丢失:对于有内部状态的组件(如 <input> 的输入内容),位置变化会导致状态错误复用(见下文示例)。
示例:无 key 时的状态丢失
function FriendList() { const [items, setItems] = useState(['前端西瓜哥', '小明', '张三']); const swap = () => { [items[0], items[1]] = [items[1], items[0]]; setItems([...items]); }; return ( <div> <ul> {items.map((item) => ( <li>{item}<input /></li> // 无 key ))} </ul> <button onClick={swap}>交换</button> </div> );}解决方案:添加 key
{items.map((item) => ( <li key={item}>{item}<input /></li> // 使用唯一值作为 key))}示例:索引作为 key 的风险
{items.map((item, index) => ( <li key={index}>{item}</li> // 不推荐))}始终为列表项提供唯一、稳定的 key。
避免使用数组索引作为 key(除非列表绝对静态)。
对于有内部状态的组件(如输入框),key 是必需的。
通过合理使用 key,可以显著提升 React 应用的性能和状态管理可靠性。