Inicio > Cursos > React > Formularios y Validación
ReactPatrones AvanzadosLección 9 de 21

Formularios y Validación

En HTML nativo, un formulario guarda sus valores internamente en el DOM. React propone un enfoque diferente llamado "formulario controlado": el componente es el único dueño de los valores mediante estado. El ciclo es: usuario escribe → onChange dispara → setEstado actualiza → React re-renderiza → el input muestra el valor del estado.

Este ciclo hace que React siempre sepa exactamente qué hay en el formulario, lo que facilita validar, transformar y enviar los datos.

La validación en formularios controlados es natural: antes de procesar el submit, recorres el objeto de estado aplicando tus reglas de negocio y acumulas los errores en un objeto.

Si hay errores, los muestras junto a cada campo y no envías; si todo está bien, llamas a tu API. e.preventDefault() en onSubmit es fundamental: evita que el comportamiento HTML nativo recargue la página. Para formularios con muchos campos y validaciones complejas, React Hook Form reduce el código a la mitad.

import { useState } from "react";

function FormRegistro() {
  const [form, setForm] = useState({
    nombre: "", email: "", password: "", confirmar: ""
  });
  const [errores, setErrores] = useState({});
  const [enviado, setEnviado] = useState(false);
  
  const validar = () => {
    const nuevosErrores = {};
    if (form.nombre.length < 2)
      nuevosErrores.nombre = "Mínimo 2 caracteres";
    if (!/^[^@]+@[^@]+\.[^@]+$/.test(form.email))
      nuevosErrores.email = "Email inválido";
    if (form.password.length < 8)
      nuevosErrores.password = "Mínimo 8 caracteres";
    if (form.password !== form.confirmar)
      nuevosErrores.confirmar = "Las contraseñas no coinciden";
    return nuevosErrores;
  };
  
  const handleChange = (e) => {
    const { name, value } = e.target;
    setForm(prev => ({ ...prev, [name]: value }));
    // Limpiar error del campo al escribir
    if (errores[name]) {
      setErrores(prev => ({ ...prev, [name]: "" }));
    }
  };
  
  const handleSubmit = (e) => {
    e.preventDefault();
    const erroresNuevos = validar();
    if (Object.keys(erroresNuevos).length > 0) {
      setErrores(erroresNuevos);
      return;
    }
    setEnviado(true);
    console.log("Formulario válido:", form);
  };
  
  return (
    <form onSubmit={handleSubmit}>
      <input name="nombre" value={form.nombre} onChange={handleChange} />
      {errores.nombre && <span className="error">{errores.nombre}</span>}
      <button type="submit">Registrarse</button>
    </form>
  );
}
Consejo📋 Para formularios complejos considera librerías como React Hook Form o Formik. Manejan validación, errores y submit eficientemente.
← Custom HooksuseReducer y Estado Complejo →

Practica esta lección

Resuelve los ejercicios del curso de React en la app, gratis y con corrección automática.

Empezar a practicar