一. 受控表单
以select选择为例,这里我们需要使用state去控制dom的状态,集中放在state去管理
function App() {const [state,setState] = useState('grapefruit')const handleSubmit = (e)=>{e.preventDefault();console.log(state);}return (<div><form onSubmit={(e)=>handleSubmit(e)}><label><select value={state} onChange={(e)=>{setState(e.target.value)}}><option value="grapefruit" >葡萄柚</option><option value="lime">酸橙</option><option value="coconut">椰子</option><option value="mango">芒果</option></select></label><input type="submit" value="提交" /></form></div>)}
二. 非受控表单
非受控的数据集中放在dom管理,取值来说依然遵循dom操作的原则
function App() {const data = useRef()const handleSubmit = (e)=>{e.preventDefault();const selectedIndex = data.current.selectedIndexconsole.log(data.current[selectedIndex].value);}return (<div><form onSubmit={(e)=>handleSubmit(e)}><label ><select defaultValue={'lime'} ref={data}><option value="grapefruit" >葡萄柚</option><option value="lime">酸橙</option><option value="coconut">椰子</option><option value="mango">芒果</option></select></label><input type="submit" value="提交" /></form></div>)}
三. 对比
| 特征 | 不受控制 | 受控 |
|---|---|---|
| 一次性提交 | ✅ | ✅ |
| 提交时验证 | ✅ | ✅ |
| 字段即时校验 | ❌ | ✅ |
| 复杂联动 | ❌ | ✅ |
| 限制输入格式(比如:首尾去空格) | ❌ | ✅ |
参考
https://goshacmd.com/controlled-vs-uncontrolled-inputs-react/
