一. 受控表单

以select选择为例,这里我们需要使用state去控制dom的状态,集中放在state去管理

  1. function App() {
  2. const [state,setState] = useState('grapefruit')
  3. const handleSubmit = (e)=>{
  4. e.preventDefault();
  5. console.log(state);
  6. }
  7. return (
  8. <div>
  9. <form onSubmit={(e)=>handleSubmit(e)}>
  10. <label>
  11. <select value={state} onChange={(e)=>{setState(e.target.value)}}>
  12. <option value="grapefruit" >葡萄柚</option>
  13. <option value="lime">酸橙</option>
  14. <option value="coconut">椰子</option>
  15. <option value="mango">芒果</option>
  16. </select>
  17. </label>
  18. <input type="submit" value="提交" />
  19. </form>
  20. </div>
  21. )
  22. }

二. 非受控表单

非受控的数据集中放在dom管理,取值来说依然遵循dom操作的原则

  1. function App() {
  2. const data = useRef()
  3. const handleSubmit = (e)=>{
  4. e.preventDefault();
  5. const selectedIndex = data.current.selectedIndex
  6. console.log(data.current[selectedIndex].value);
  7. }
  8. return (
  9. <div>
  10. <form onSubmit={(e)=>handleSubmit(e)}>
  11. <label >
  12. <select defaultValue={'lime'} ref={data}>
  13. <option value="grapefruit" >葡萄柚</option>
  14. <option value="lime">酸橙</option>
  15. <option value="coconut">椰子</option>
  16. <option value="mango">芒果</option>
  17. </select>
  18. </label>
  19. <input type="submit" value="提交" />
  20. </form>
  21. </div>
  22. )
  23. }

三. 对比

特征 不受控制 受控
一次性提交
提交时验证
字段即时校验
复杂联动
限制输入格式(比如:首尾去空格)

参考

https://goshacmd.com/controlled-vs-uncontrolled-inputs-react/