第 20 课2026.09.28
允许用户暂时清空输入框,但不把空白标题写入课程列表。
第 20 课:提交前检查课程标题非空
- 日期:2026-09-28
- 课程序号:第 20 课
- 知识点:表单
onSubmit中校验未提交输入
用途或适用场景
允许用户暂时清空输入框,但不把空白标题写入课程列表。
核心概念
输入框局部 draft 只是未提交的交互状态;父组件的 lessons 仍是已保存标题的唯一事实源。提交时 trim(),仅非空时调用既有 onRename。
最小代码或操作示例
jsx
import { useState } from 'react';
function LessonItem({ item, onRename }) {
const [draft, setDraft] = useState(item.title);
function submit(event) {
event.preventDefault();
const title = draft.trim();
if (!title) return;
onRename(item.id, title);
setDraft(title);
}
return <li><form onSubmit={submit}>
<label>课程标题 <input value={draft}
onChange={event => setDraft(event.target.value)} /></label>
<button type="submit">保存</button>
</form></li>;
}
// 第 19 课 LessonList 的 lessons、onRename、反转按钮和
// <LessonItem key={item.id} item={item} onRename={onRename} /> 保持不变。3~5 分钟练习
清空 React 课程的输入框并保存;然后输入“React 入门”保存,再反转列表。
参考答案
空白提交不更新 lessons;“React 入门”保存到 id='l1',反转后仍跟随该课程。
与上一课的联系
沿用第 19 课的 LessonItem、key={item.id}、父组件 onRename 和反转列表;本课只把逐字写入改为表单提交时校验,局部 draft 只承载未提交输入;下一课可给空白提交显示明确反馈。
时效校验
时效校验:2026-09-28(已核对 React 19.3 官方 <form> 与 <input> 文档;onSubmit、preventDefault 和受控输入用法未见废弃标记)。