受控和非受控表单怎么选?
先理解原理和示例,再练习完整口述与追问。
回答要点
受控表单由 value / checked 与更新处理驱动;非受控由 DOM 保存当前值,defaultValue 只提供初始值。避免组件生命周期内无意切换两种模式;按复杂度和现有表单方案选择。
原理拆解
受控输入由 React state 决定 value,onChange 负责更新状态,便于校验、联动与提交统一快照;非受控输入让 DOM 保留值,通常以 defaultValue 初始化并通过 ref/FormData 读取。选择取决于交互复杂度和性能,不是受控总是更先进。文件输入等本身也有浏览器限制。
示例与推演
编辑表单需要实时联动和错误显示,可用受控字段并在提交时验证;只在提交读取的简单搜索表单可用原生 form 与 FormData。受控文本初始值用空字符串而不是先 undefined 后变字符串,避免在两种模式间意外切换。切换编辑对象时还要定义草稿重置规则。
易错点
value 不配 onChange 或只读语义会使输入无法正常编辑。defaultValue 之后变化不会像受控 value 一样持续同步;中文输入还要处理组合输入时序。
参考回答可直接练习口述
受控输入由 React 的 value/checked 和更新回调管理当前值,便于联动和校验;非受控输入把当前值交给 DOM,defaultValue 只是初始默认值。两者都可以合理使用,重点是保持模式稳定,别从 undefined 意外切换成受控。文件输入的值不能像普通文本那样任意程序设定。
面试官可能继续问追问与完整解答展开收起
追问
接口回填为何改 defaultValue 不生效?输入卡顿怎样定位?文件输入框如何处理?
追问回答
非受控输入不会因后续 defaultValue 变化自动变成新的当前值,接口回填可以改为受控、明确重建或通过合适 DOM API 处理。输入卡顿先缩小状态影响范围,定位昂贵渲染,而不是把输入更新降成 transition。文件通过 files 读取并由上传流程管理。