React 表单与事件

React表单与事件处理指南

React表单与事件处理指南

适合初学者的详细知识点汇总,用通俗易懂的语言解释React表单与事件处理的核心概念

📝

受控组件

大白话解释:

受控组件就像是React完全掌控的表单元素。它的值由React状态(state)控制,每次用户输入都会触发状态更新,React再用新状态更新输入框内容。

关键点: 输入框的值完全由React状态驱动,输入变化会调用setState()更新状态

代码示例:

function MyForm() {
  const [inputValue, setInputValue] = useState('');
  
  const handleChange = (e) => {
    // 每次输入都更新状态
    setInputValue(e.target.value);
  };
  
  return (
    <input 
      type="text" 
      value={inputValue} 
      onChange={handleChange} 
    />
  );
}

实际例子: 登录表单中的用户名输入框。当用户输入时,React会捕获每次按键更新状态,同时输入框显示的内容也来自状态。

🔍

非受控组件

大白话解释:

非受控组件就像是传统HTML表单元素,React不直接控制它的值,而是通过ref在需要时访问它的值。

关键点: 输入框的值由DOM自身管理,只在需要时(如表单提交)获取值

代码示例:

function MyForm() {
  const inputRef = useRef(null);
  
  const handleSubmit = (e) => {
    e.preventDefault();
    // 提交时才获取输入框的值
    alert('输入的值: ' + inputRef.current.value);
  };
  
  return (
    <form onSubmit={handleSubmit}>
      <input type="text" ref={inputRef} />
      <button type="submit">提交</button>
    </form>
  );
}

实际例子: 文件上传输入框。文件输入通常是非受控的,因为它的值无法通过程序设置,只能在用户选择文件后获取。

🎮

事件处理

大白话解释:

React中的事件处理就像是给元素添加”监听器”,当特定动作发生时(如点击、输入、提交等),执行你定义的函数。

关键点: 使用驼峰式命名(onClick, onChange),传递函数作为处理程序

常见事件:

  • onClick – 点击事件
  • onChange – 输入内容变化
  • onSubmit – 表单提交
  • onFocus/onBlur – 获得/失去焦点
  • onKeyDown/onKeyUp – 键盘按下/释放

代码示例:

function EventExample() {
  const handleClick = () => {
    alert('按钮被点击了!');
  };
  
  return (
    <>
      <button onClick={handleClick}>点击我</button>
      
      <input 
        type="text" 
        onChange={(e) => console.log(e.target.value)} 
      />
    </>
  );
}
📤

表单提交处理

大白话解释:

处理表单提交就像是在用户点击”提交”按钮时,收集所有表单数据并进行处理(如验证、发送到服务器)。

关键点: 阻止默认提交行为,收集表单数据,处理数据

代码示例:

function SubmitForm() {
  const [name, setName] = useState('');
  
  const handleSubmit = (e) => {
    e.preventDefault(); // 阻止表单默认提交行为
    alert(`提交的名字: ${name}`);
  };
  
  return (
    <form onSubmit={handleSubmit}>
      <label>
        名字:
        <input 
          type="text" 
          value={name} 
          onChange={(e) => setName(e.target.value)} 
        />
      </label>
      <button type="submit">提交</button>
    </form>
  );
}

实际例子: 用户注册表单。当用户填写完信息点击提交时,我们需要收集所有输入的数据,验证是否有效,然后发送到服务器创建新账户。

🔢

处理多个输入

大白话解释:

当表单有多个输入字段时,不需要为每个字段单独写处理函数,可以用一个函数处理所有字段。

关键点: 利用字段的name属性识别是哪个字段发生了变化

代码示例:

function MultiInputForm() {
  const [formData, setFormData] = useState({
    username: '',
    email: '',
    password: ''
  });
  
  const handleChange = (e) => {
    const { name, value } = e.target;
    // 使用字段名更新对应的状态
    setFormData(prevData => ({
      ...prevData, // 复制之前的状态
      [name]: value  // 更新变化的字段
    }));
  };
  
  return (
    <form>
      <input 
        type="text"
        name="username"
        value={formData.username}
        onChange={handleChange}
        placeholder="用户名"
      />
      <input 
        type="email"
        name="email"
        value={formData.email}
        onChange={handleChange}
        placeholder="邮箱"
      />
      <input 
        type="password"
        name="password"
        value={formData.password}
        onChange={handleChange}
        placeholder="密码"
      />
    </form>
  );
}

实际例子: 用户资料编辑表单,包含用户名、邮箱、电话、地址等多个字段。用一个状态对象管理所有字段值。

表单验证

大白话解释:

表单验证就是检查用户输入是否符合要求,比如邮箱格式是否正确、密码是否足够复杂等。

关键点: 在提交前或输入时进行验证,提供清晰的错误提示

验证方式:

  • HTML5内置验证:required, minLength, pattern等
  • JavaScript验证:在提交处理函数或onBlur事件中验证
  • 第三方库:Formik, Yup, React Hook Form

代码示例:

function ValidatedForm() {
  const [email, setEmail] = useState('');
  const [error, setError] = useState('');
  
  const validateEmail = (email) => {
    const regex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
    return regex.test(email);
  };
  
  const handleSubmit = (e) => {
    e.preventDefault();
    if (!validateEmail(email)) {
      setError('请输入有效的邮箱地址');
      return;
    }
    // 提交表单...
  };
  
  return (
    <form onSubmit={handleSubmit}>
      <input 
        type="email"
        value={email}
        onChange={(e) => setEmail(e.target.value)}
        onBlur={() => {
          if (email && !validateEmail(email)) {
            setError('请输入有效的邮箱地址');
          } else {
            setError('');
          }
        }}
        placeholder="邮箱"
      />
      {error && <div style={{ color: 'red' }}>{error}</div>}
      <button type="submit">提交</button>
    </form>
  );
}

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部