Explica cómo modelar validación, envío, errores, éxito y estados pendientes en formularios React sin mezclar reglas de dominio con detalles de interfaz.
const result ={
fieldErrors:{
email:"Este correo ya está registrado",},
formError:"No pudimos crear la cuenta",};
Un error de campo debe aparecer junto al control. Un fallo general de red o servidor pertenece a una región global. No reduzcas todo a “Algo salió mal” si puedes orientar al usuario sin exponer detalles internos.
También deshabilita el botón o usa pending de Actions. La protección cliente mejora UX, pero el servidor debe manejar reintentos y duplicados mediante idempotencia cuando la operación lo necesite.
No limpies el formulario al iniciar. Si falla, el usuario debería conservar lo escrito. Limpia únicamente tras confirmación de éxito o cuando el producto lo solicite claramente.
asyncfunctionhandleSubmit(event: React.FormEvent<HTMLFormElement>){
event.preventDefault();const form = event.currentTarget;const formData =newFormData(form);setState({ status:"submitting"});try{const result =awaitcreateUser(formData);if(!result.ok){setState({
status:"error",
formError: result.formError,
fieldErrors: result.fieldErrors,});return;}setState({ status:"success", message:"Usuario creado"});
form.reset();}catch{setState({
status:"error",
formError:"No fue posible conectar con el servidor",
fieldErrors:{},});}}
Distingue errores esperados de validación, conflictos de negocio y fallos inesperados.
Comprobar disponibilidad mientras se escribe necesita debounce, cancelación y estados como checking, available o unavailable. No uses el resultado cliente como garantía: el valor puede cambiar antes del submit.