第 18 课2026.09.23
重新排列课程列表时,让每条课程的输入框继续对应原课程。
第 18 课:稳定 key 保留列表项身份
- 日期:2026-09-23
- 课程序号:第 18 课
- 知识点:重排时的组件身份
用途或适用场景
重新排列课程列表时,让每条课程的输入框继续对应原课程。
核心概念
key={item.id} 让 React 按业务 ID 匹配重排前后的 LessonItem;数组索引会随着位置变化,不能代表课程身份。
最小代码或操作示例
jsx
import { useState } from 'react';
function LessonItem({ item, onRename }) {
return <li><input defaultValue={item.title} />
<button onClick={() => onRename(item.id)}>重命名</button></li>;
}
export default function LessonList() {
const [lessons, setLessons] = useState([
{ id: 'l1', title: 'React' }, { id: 'l2', title: 'Vue' }
]);
const onRename = id => console.log(id);
return <>
<button onClick={() => setLessons(items => [...items].reverse())}>反转顺序</button>
<ul>{lessons.map(item =>
<LessonItem key={item.id} item={item} onRename={onRename} />
)}</ul>
</>;
}3~5 分钟练习
编辑第一条课程的输入框,再反转列表,观察输入内容跟随哪条课程。
参考答案
输入框随同一 item.id 的组件移动;保留稳定 key 时,不会错误地留在原数组位置。
与上一课的联系
沿用第 17 课的 LessonItem、lessons.map 和 key={item.id};本课只增加反转顺序来验证 key 对输入框身份的作用;完成后下一课可把输入框改为受控编辑并提交标题。
时效校验
时效校验:2026-09-24(React 官方教程;稳定 key 与组件状态保留规则未见废弃标记)。