React 表单与事件

登录框、搜索栏、注册页……表单负责收集用户输入,是组件交互的主角。与普通 HTML 不同,React 表单的推荐做法是「受控组件」:输入框的值由 state 决定,任何改动都经过事件处理函数,数据流向单一、可预测。本节把表单与事件一次讲透。

受控组件

把输入框的 value 绑定到 state,再用 onChange 更新 state,输入框就「受控」了——页面显示什么、能输成什么样,全部由代码说了算。

import { useState } from 'react';
export default function NameInput() {
  const [name, setName] = useState('');

  return (
    <input
      value={name}                           // 值来自 state
      onChange={(e) => setName(e.target.value)} // 每次敲键都更新
      placeholder="请输入用户名"
    />
  );
}

表单提交与事件对象

点击提交按钮时浏览器默认会刷新页面,必须先用 e.preventDefault() 拦下来,再自行处理数据。

function Login() {
  const [user, setUser] = useState({ name: '', pwd: '' });

  function handleChange(e) {
    // 借助 name 属性,一个函数处理所有输入框
    setUser({ ...user, [e.target.name]: e.target.value });
  }

  function handleSubmit(e) {
    e.preventDefault(); // 阻止默认刷新
    console.log('提交内容:', user);
    // 输出:提交内容:{name: '张三', pwd: '123456'}
  }

  return (
    <form onSubmit={handleSubmit}>
      <input name="name" value={user.name} onChange={handleChange} />
      <input name="pwd" type="password" value={user.pwd} onChange={handleChange} />
      <button type="submit">登录</button>
    </form>
  );
}

文本域、下拉框与单选框

它们同样是受控写法:textarea 与 select 直接读 value,单选框通过 checked 判断选中。

function Profile() {
  const [form, setForm] = useState({ intro: '', city: 'beijing' });
  function set(k, v) {
    setForm({ ...form, [k]: v });
  }
  return (
    <>
      <textarea value={form.intro} onChange={(e) => set('intro', e.target.value)} />
      <select value={form.city} onChange={(e) => set('city', e.target.value)}>
        <option value="beijing">北京</option>
        <option value="shanghai">上海</option>
      </select>
      <p>已选城市:{form.city}</p>
    </>
  );
}

复选框与常用事件一览

复选框的选中状态存在 e.target.checked;其它常用事件还有 onClick、onFocus、onBlur、onKeyDown。

function Subscribe() {
  const [agree, setAgree] = useState(false);

  return (
    <label>
      <input type="checkbox" checked={agree}
        onChange={(e) => setAgree(e.target.checked)} />
      我已阅读并同意协议(当前:{agree ? '已勾选' : '未勾选'})
    </label>
  );
}

小结

React 表单的核心是「受控」:value 配 onChange,state 是唯一数据源;提交时用 preventDefault 拦下默认刷新。文本域、下拉框、单选框只是换了取值字段,思路完全一致。

笔记加载中…