前端达人小视频
,赞3
今天我们聚焦一个「写前端永远逃不掉」的主题:表单处理。 你有没有遇到过这些问题:
别急,这一期我们就用真实例子 + 背后原理,一次性理清楚 React 中的表单处理逻辑,带你站在更工程化的视角看表单。
在原生 HTML 中,表单元素(比如 <input>
)自带内部状态:
你填了什么,浏览器记着;你点了提交,浏览器打包给后端。
但到了 React,“组件状态要统一由你来掌控”,这就带来一个问题:
🔄 要不要把
<input>
的值也交给组件 state 管?
这时候你就面临选择:
做法 | 特点 |
---|---|
受控组件 | React 负责存 & 改值,value 受 state 控制 |
非受控组件 | 浏览器 DOM 自己管理,React 只负责“拿一下” |
很多初学者会觉得“我只是个输入框,哪来那么复杂”,但其实——写 React 表单没写好,是最容易留下 bug 的地方之一。
📌 受控字段 Controlled Field
React 完全掌控字段值,配合 value
+ onChange
实现数据同步。
onChange
→ 调用 setState
更新值。value={state}
将新值绑定回组件。📌 非受控字段 Uncontrolled Field
React 不管输入框的值,用浏览器默认行为,必要时通过 ref
获取 DOM 节点来拿值。
defaultValue
ref.current.value
🧠 一句话总结:
Controlled 是“值存我这”,Uncontrolled 是“值你自己管”。
const [name, setName] = useState('');
<input
type="text"
value={name}
onChange={e => setName(e.target.value)}
/>
🔍 解释:
value={name}
:值由组件状态决定onChange
:每次输入更新组件 stateconst nameRef = useRef();
<input type="text" defaultValue="Tom" ref={nameRef} />
<button onClick={() => alert(nameRef.current.value)}>
提交
</button>
🔍 解释:
defaultValue
初始化值,只作用于第一次渲染ref.current.value
获取当前值在 React 中,组件的 UI = 函数(state) 所以任何用户行为,最终都应该反映到 state 上,形成闭环:
State → Render UI → onChange Event → Update State
🔁 每次输入其实是两次操作:
onChange
setState
改值,再 render 回去虽然多了一步,但换来了:
✅ 状态统一管理
✅ 更容易 debug 和回溯
✅ 便于联动逻辑(如禁用按钮、动态校验)
它就像「只读收件箱」:
适用于这种场景:
场景 | 推荐写法 | 理由 |
---|---|---|
用户注册、登录 | Controlled | 需要实时反馈和验证 |
文件上传 | Uncontrolled | <input type="file"> 是只读字段 |
表单仅用于一次性收集值 | Uncontrolled | 节省性能 |
表单字段需要与其他组件状态联动 | Controlled | 更可维护 |
使用 React Hook Form | Controlled + ref混合 | 更高效的封装形式 |
💡 文件上传字段是一个经典案例:
<input type="file" ref={fileRef} />
为什么不能用受控写法? 因为 <input type="file">
的 value
是只读的!
<input value="abc" />
不绑定 onChange
就写 value
,React 会警告你:你让它受控了,但不给它机会改变!
const [value, setValue] = useState('abc');
<input value={value} onChange={e => setValue(e.target.value)} />
项目 | 受控字段 | 非受控字段 |
---|---|---|
控制权 | React state | DOM 自身 |
使用场景 | 表单联动、即时校验 | 简单提交、上传文件 |
性能 | 会触发重新渲染 | 不依赖组件更新 |
调试性 | 更容易统一 debug | 值存 DOM,调试成本高 |
下一期,我们将上手使用社区最火的表单库之一 —— React Hook Form,带你感受表单处理的极致简洁。
#React #React播客 #前端播客 #前端达人 #TypeScript