10-4-formulario
Explicación Detallada del Código de Formulario de Contacto
Este código muestra un patrón común en React donde separamos un formulario en componentes independientes que se comunican a través de props. Vamos a analizarlo en profundidad:
Estructura General del Código
// App.js - Componente principal
function App() {
const [formData, setFormData] = useState({});
const handleSubmit = (data) => {
console.log("Datos enviados:", data);
setFormData(data);
};
return (
<div>
<FormularioContacto onSubmit={handleSubmit} />
<DatosEnviados data={formData} />
</div>
);
}
// FormularioContacto.js - Componente del formulario
function FormularioContacto({ onSubmit }) {
const [input, setInput] = useState("");
const enviar = (e) => {
e.preventDefault();
onSubmit({ email: input });
};
return (
<form onSubmit={enviar}>
<input
value={input}
onChange={(e) => setInput(e.target.value)}
/>
<button type="submit">Enviar</button>
</form>
);
}Flujo de Datos (Diagrama Conceptual)
[Usuario escribe] → [Input] → [FormularioContacto] → [App] → [DatosEnviados]Explicación Paso a Paso
1. Componente App (Padre)
const [formData, setFormData] = useState({});formData: Estado que almacenará los datos enviados desde el formulario
Inicializado como objeto vacío
{}
const handleSubmit = (data) => {
console.log("Datos enviados:", data);
setFormData(data);
};handleSubmit: Función que recibe los datos del formulario hijo
Hace dos cosas:
Muestra los datos en consola
Actualiza el estado
formDatacon los nuevos datos
<FormularioContacto onSubmit={handleSubmit} />Pasa la función
handleSubmitcomo proponSubmital componente hijo
<DatosEnviados data={formData} />Pasa los datos del formulario al componente que los mostrará
2. Componente FormularioContacto (Hijo)
function FormularioContacto({ onSubmit }) {Recibe la prop
onSubmitdel componente padre
const [input, setInput] = useState("");input: Estado local para manejar el valor del campo de email
const enviar = (e) => {
e.preventDefault();
onSubmit({ email: input });
};enviar: Función que se ejecuta al enviar el formulario
Previene el comportamiento por defecto del formulario
Llama a
onSubmit(la función del padre) con los datos en formato objeto
<input
value={input}
onChange={(e) => setInput(e.target.value)}
/>Input controlado:
valueestá vinculado al estadoinputonChangeactualiza el estado con cada cambio
Ventajas de esta Estructura
Separación de responsabilidades:
FormularioContactosolo maneja la entrada de datosAppmaneja el estado global y la lógica de envío
Reutilización:
El formulario puede usarse en diferentes partes de la aplicación
Puede recibir diferentes funciones
onSubmit
Mantenibilidad:
Cambios en el formulario no afectan la lógica principal
Fácil de extender (añadir más campos, validaciones, etc.)
Ejemplo de Flujo Completo
Usuario escribe "ejemplo@mail.com" en el input
onChangeactualiza el estadoinputenFormularioContactoUsuario hace click en Enviar
Se ejecuta
enviar:Previene recarga de página
Llama a
onSubmit({ email: "ejemplo@mail.com" })
Apprecibe los datos:Muestra en consola
Actualiza
formDataa{ email: "ejemplo@mail.com" }
DatosEnviadosrecibe los nuevos datos y los muestra
Posibles Mejoras
Validación de email:
const enviar = (e) => {
e.preventDefault();
if (!input.includes('@')) {
alert('Ingrese un email válido');
return;
}
onSubmit({ email: input });
};Múltiples campos:
// En FormularioContacto
const [form, setForm] = useState({
email: '',
nombre: '',
telefono: ''
});
const handleChange = (e) => {
setForm({
...form,
[e.target.name]: e.target.value
});
};Feedback visual:
const [enviado, setEnviado] = useState(false);
// Después de onSubmit
setEnviado(true);
setTimeout(() => setEnviado(false), 2000);
Comentarios
Publicar un comentario