Forms & Controlled Components

⚛️ ReactLesson 7Intermediate

In React, form elements are best managed as controlled components — where React state is the single source of truth for every input's value. This gives you complete control over validation, formatting, and submission.

1 Controlled Inputs
React — Controlled Form
function RegistrationForm() {
  const [form, setForm] = useState({
    name: "", email: "", password: "", role: "viewer", agree: false
  });
  const [errors, setErrors] = useState({});

  const update = (field) => (e) => {
    const value = e.target.type === "checkbox" ? e.target.checked : e.target.value;
    setForm(prev => ({ ...prev, [field]: value }));
  };

  const validate = () => {
    const errs = {};
    if (!form.name)           errs.name = "Name is required";
    if (!form.email.includes("@")) errs.email = "Invalid email";
    if (form.password.length < 8)  errs.password = "Min 8 characters";
    return errs;
  };

  const handleSubmit = (e) => {
    e.preventDefault();
    const errs = validate();
    if (Object.keys(errs).length > 0) { setErrors(errs); return; }
    console.log("Submitting:", form);
  };

  return (
    <form onSubmit={handleSubmit}>
      <input value={form.name} onChange={update("name")} placeholder="Full Name" />
      {errors.name && <span className="error">{errors.name}</span>}

      <input value={form.email} onChange={update("email")} type="email" />
      <input value={form.password} onChange={update("password")} type="password" />

      <select value={form.role} onChange={update("role")}>
        <option value="viewer">Viewer</option>
        <option value="editor">Editor</option>
        <option value="admin">Admin</option>
      </select>

      <label>
        <input type="checkbox" checked={form.agree} onChange={update("agree")} />
        I agree to Terms
      </label>

      <button type="submit">Register</button>
    </form>
  );
}
2 Code Challenge
Challenge: Build a multi-step form (3 steps) with "Next" and "Back" buttons. Store all field values in a single state object. On the final step, display a summary of all entered data.