e.ta"> e.ta"> e.ta">
React 词条目录
前端Wiki/React/进阶/表单实战

多字段表单统一处理

表单字段一多,一个字段一个 useState 会很啰嗦。统一做法:把所有字段放进一个 state 对象,用事件对象的 e.target.name 做动态键名更新:setForm(prev => ({...prev, [name]: value}))。

React 18 的自动批处理让“输入即更新整个对象”也不会卡。字段特别多或校验复杂时再考虑 Formik / react-hook-form——它们的底层思路与此相同,只是替你管理了这部分重复代码。

  • 多字段用对象 state + [name]: value 动态键更新
  • 复选框注意取 e.target.checked,下拉取 e.target.value
  • 复杂表单上 react-hook-form,但核心原理仍是受控/非受控
HTML
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>多字段表单</title>
<script src="https://unpkg.com/react@18/umd/react.development.js" crossorigin></script>
<script src="https://unpkg.com/react-dom@18/umd/react-dom.development.js" crossorigin></script>
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
</head>
<body>
<div id="root"></div>
<script type="text/babel">
const { useState } = React;

function JoinForm() {
  const [form, setForm] = useState({ name: '', email: '', agree: false });

  // 统一处理器:用 name 属性动态更新对应字段
  function update(e) {
    const { name, value, type, checked } = e.target;
    setForm(prev => ({ ...prev, [name]: type === 'checkbox' ? checked : value }));
  }

  function submit(e) {
    e.preventDefault();
    console.log('表单数据:', form);
    alert(JSON.stringify(form, null, 2));
  }

  return (
    <form onSubmit={submit} style={{ padding: 16 }}>
      <p><label>姓名 <input name="name" value={form.name} onChange={update} /></label></p>
      <p><label>邮箱 <input name="email" type="email" value={form.email} onChange={update} /></label></p>
      <p><label><input type="checkbox" name="agree" checked={form.agree} onChange={update} /> 同意协议</label></p>
      <button disabled={!form.agree}>提交</button>
    </form>
  );
}

ReactDOM.createRoot(document.getElementById('root')).render(<JoinForm />);
</script>
</body>
</html>
本节要点多字段表单:对象 state + [name] 动态键;checkbox 取 checked,其余取 value。
🔗 相关词条JavaScriptES6 模块HTML