单片机原理与应用:从基础到智能控制实战
2026/7/18 18:10:58
| 类型 | 数据存储 | 更新方式 | 典型用法 |
|---|---|---|---|
| 受控 Controlled | React State | onChange→setState | 实时校验、提交前统一处理 |
| 非受控 Uncontrolled | DOM/ref | ref.current.value | 旧库迁移、极少变动 |
一句话:受控是“React 说了算”,非受控是“DOM 说了算”。
onChange// ❌ 有 value 没有 onChange → 输入框锁死 <input value={text} />修复:完整受控链路
<input value={text} onChange={e => setText(e.target.value)} />// ❌ 立即读取 ref const inputRef = useRef(); console.log(inputRef.current.value); // null修复:在生命周期后读取
useEffect(() => { console.log(inputRef.current?.value); // ✅ 已挂载 }, []);value+ref打架// ❌ 又受控又非受控 <input ref={inputRef} value={text} onChange={e => setText(e.target.value)} /> <button onClick={() => inputRef.current.focus()}>Focus</button>修复:明确边界——受控主导,ref 仅用于 DOM 操作(焦点、滚动等),不通过 ref 读值。
const [text, setText] = useState(''); const inputRef = useRef(); const handleSubmit = () => { // ❌ 可能读到旧值 console.log(inputRef.current.value); };修复:只读受控 state
const handleSubmit = () => { console.log(text); // ✅ 与视图同步 };| 场景 | 推荐方案 |
|---|---|
| 实时校验 | 受控 +onChange |
| 旧库迁移 | 非受控 +ref |
| 焦点/滚动 | 受控 +ref(只操作 DOM,不读值) |
| 提交前统一 | 受控 state 统一处理 |
边界口诀:
「受控管数据,ref 管 DOM;不通过 ref 读值,不通过 state 写 DOM。」
useCallback/useMemo)。onChangeuseEffect)「受控管数据,ref 管 DOM;不打架,不越界。」
让受控负责状态,让 ref 负责行为,表单再也不会“崩掉”!
最后问候亲爱的朋友们,并邀请你们阅读我的全新著作
📚 《 React开发实践:掌握Redux与Hooks应用 》