Formularios y componentes controlados
💡 🎯 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.
- El estado
nombreguarda el texto. - El campo muestra
value={nombre}. - Cada tecla dispara
onChange, que actualiza el estado cone.target.value. - 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
| Campo | Propiedad que se controla | Valor que lees |
|---|---|---|
<input type="text">, email, number… | value | e.target.value |
<textarea> | value (¡como un input!) | e.target.value |
<select> | value | e.target.value |
<input type="checkbox"> | checked | e.target.checked |
<input type="radio"> | checked de cada opción | e.target.value |
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:
📌 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.
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.
- Valida al escribir para guiar, y al enviar para asegurar.
- No muestres errores antes de tiempo: espera a que el campo tenga contenido o haya sido tocado.
- Deshabilita el botón solo si explicas por qué; mejor muestra el mensaje junto al campo.
- Recuerda: validar en el navegador mejora la experiencia, pero la validación de seguridad real siempre se hace en el servidor.
6.Errores frecuentes
valuesinonChange: el campo se bloquea.- Usar
e.target.valuepara un checkbox: usae.target.checked. - Olvidar
e.preventDefault()enonSubmit: la página se recarga. - Valor inicial
undefined: empieza siempre con""(texto),false(casilla) o un valor definido; si no, pasarás de no controlado a controlado y React avisará. - Mutar el objeto del formulario: crea siempre una copia con
{ ...datos, [name]: value }. - Convertir números:
e.target.valuees siempre texto; usaNumber(e.target.value)oe.target.valueAsNumber. - Olvidar
htmlFor/id: los campos sin etiqueta asociada son inaccesibles.
📒 Apuntes para llevar
- Un campo controlado muestra
valuedel estado y actualiza el estado enonChange. - Sin
onChange, un campo convaluequeda bloqueado. - Textos,
textareayselectusanvalue; las casillas y radios usanchecked. - Con muchos campos, guarda un objeto y actualiza con
{ ...datos, [name]: value }. - Usa
onSubmiten el<form>y llama ae.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érmino | Significado |
|---|---|
| Componente controlado | Campo cuyo valor lo dicta el estado de React. |
onChange | Evento que se dispara cuando cambia el valor de un campo. |
e.target | El elemento que provocó el evento; value y checked salen de él. |
preventDefault | Cancela la acción por defecto del navegador (por ejemplo, recargar al enviar). |
| Propiedad calculada | Sintaxis { [name]: value } que usa una variable como nombre de propiedad. |
| Validación | Comprobar 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?
El estado es la fuente de verdad; el campo solo refleja ese valor.
¿Qué propiedad lees en un checkbox?
Los checkboxes y radios usan checked.
¿Qué pasa si olvidas e.preventDefault() en onSubmit?
Sin cancelarlo, el navegador hace su envío clásico y recarga.
¿Para qué sirve { ...datos, [name]: value }?
Copia las propiedades existentes y reemplaza únicamente la que corresponde al campo.
e.target.value de un <input type="number">, ¿qué tipo tiene?
Siempre es texto; conviértelo con Number() si lo necesitas.
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.