Saltar al contenido
Curso de React
Todos los cursos Ir al ejercicio →

Formularios y componentes controlados

  • ⏱ 55 minutos
  • 📶 Nivel: principiante
  • 🧩 Incluye ejercicio

💡 🎯 Al terminar esta lección podrás…

  • Crear campos controlados de todos los tipos.
  • Manejar un formulario completo con un solo objeto de estado.
  • Enviar un formulario con onSubmit.
  • Validar y dar retroalimentación al usuario.

1.Componentes controlados

En HTML normal, un <input> guarda su propio valor: tú lo lees cuando lo necesitas. En React hay una forma más potente: el estado es la única fuente de la verdad y el campo solo muestra lo que dice el estado. A esto se le llama un componente controlado.

⚛️ Tu primer campo controlado
Consola
  1. El estado nombre guarda el texto.
  2. El campo muestra value={nombre}.
  3. Cada tecla dispara onChange, que actualiza el estado con e.target.value.
  4. React vuelve a dibujar y el campo muestra el valor nuevo.

💡 Consejo · Ventajas

Como el valor vive en el estado, puedes mostrarlo en otras partes (como el saludo y el contador de letras), validarlo, darle formato o borrarlo (setNombre("")) en cualquier momento.

⚠️ Importante · No olvides onChange

Si pones value sin onChange, el campo queda bloqueado: no puedes escribir y React avisa en la consola. Si solo quieres un valor inicial editable, usa defaultValue.

2.Cada tipo de campo, a su manera

CampoPropiedad que se controlaValor que lees
<input type="text">, email, number…valuee.target.value
<textarea>value (¡como un input!)e.target.value
<select>valuee.target.value
<input type="checkbox">checkede.target.checked
<input type="radio">checked de cada opcióne.target.value
⚛️ Texto, selección, casilla y opciones
Consola

3.Muchos campos, un solo estado

Con formularios largos, un useState por campo se vuelve pesado. Una técnica muy común es guardar un objeto y usar el atributo name de cada campo para actualizar la propiedad correcta con una sola función:

⚛️ Un manejador para todos los campos
Consola

📌 Nota · [name]: value

Los corchetes crean una propiedad calculada: si name vale "correo", el objeto resultante cambia correo. Combinado con ...datos (que copia lo demás) actualizas un campo sin tocar el resto.

4.Enviar el formulario

Para manejar el envío usa onSubmit en el <form> (no onClick en el botón: así también funciona al pulsar Enter). Siempre empieza con e.preventDefault(); si no, el navegador recarga la página.

⚛️ onSubmit y preventDefault
Consola

5.Validar y dar retroalimentación

Como los datos están en el estado, validar es calcular en cada dibujo si son correctos. No hace falta un estado extra para los errores: se derivan.

⚛️ Validación derivada del estado
Consola

6.Errores frecuentes

📒 Apuntes para llevar

  • Un campo controlado muestra value del estado y actualiza el estado en onChange.
  • Sin onChange, un campo con value queda bloqueado.
  • Textos, textarea y select usan value; las casillas y radios usan checked.
  • Con muchos campos, guarda un objeto y actualiza con { ...datos, [name]: value }.
  • Usa onSubmit en el <form> y llama a e.preventDefault().
  • La validación se deriva del estado: no necesitas estado extra para los errores.
  • La validación en el navegador es comodidad; la de seguridad va en el servidor.

7.Glosario

TérminoSignificado
Componente controladoCampo cuyo valor lo dicta el estado de React.
onChangeEvento que se dispara cuando cambia el valor de un campo.
e.targetEl elemento que provocó el evento; value y checked salen de él.
preventDefaultCancela la acción por defecto del navegador (por ejemplo, recargar al enviar).
Propiedad calculadaSintaxis { [name]: value } que usa una variable como nombre de propiedad.
ValidaciónComprobar que los datos cumplen las reglas esperadas.

🧠 Comprueba lo aprendido

Elige una respuesta en cada pregunta. Verás al instante si acertaste y por qué.

¿Qué hace controlado a un campo de texto?

¿Qué propiedad lees en un checkbox?

¿Qué pasa si olvidas e.preventDefault() en onSubmit?

¿Para qué sirve { ...datos, [name]: value }?

e.target.value de un <input type="number">, ¿qué tipo tiene?

Tu progreso se guarda en este navegador y se refleja en el índice del curso.

💡 🚀 ¡Ahora te toca!

La práctica fija lo aprendido. Pasa al ejercicio de esta lección.

Ir al ejercicio