DEV Community

Silviu Technology
Silviu Technology

Posted on

React: inputs de email que no cansan

En muchos formularios, el campo de email se rompe por una razon bastante simple: mezcla validacion, negocio y ansiedad visual en el mismo segundo. La persona apenas empieza a escribir y ya recibe borde rojo, texto duro y un boton que parece enfadado. No es un drama enorme, pero si desgasta un poco la experiencia.

Cuando el producto tambien quiere detectar un correo temporal, el riesgo sube. He visto equipos meter esa regla en el primer onChange, como si toda direccion sospechosa necesitara castigo inmediato. En la practica, eso vuelve el registro mas confuso, no mas claro. Y luego cuesta explicar por que la conversion cae un poco, o por que soporte recibe preguntas raras de gente que si queria terminar el signup.

El error comun: tratar el email como una alarma

La mayoria de los problemas vienen de este combo:

  1. validar demasiado pronto
  2. usar el mismo mensaje para cualquier caso
  3. mover el layout cada vez que aparece ayuda o error

Ese patron castiga a quien todavia esta pensando, no a quien ya cometio un error real. Si alguien va por ana@empre..., aun no necesita una sentencia visual. Solo necesita espacio para acabar la accion. Parece obvio, pero no siempre se dise;a asi.

Tambien conviene separar "formato invalido" de "dominio que no queremos para este flujo". Son cosas distintas. Si juntas ambos casos, analytics se ensucia y el copy pierde precision. En equipos donde probamos varias bandejas de QA, incluso aparecen notas raras como temp org mail o tempail en tickets y logs; por eso prefiero que el frontend no tome decisiones demasiado pronto ni demasiado literales.

Un patron pequeño de React que evita ruido

Mi version favorita tiene tres pasos:

  1. en onChange, solo limpia estado viejo y detecta formato muy basico
  2. en onBlur, muestra feedback si ya hay una señal clara de problema
  3. en onSubmit, corre reglas de negocio o comprobaciones mas caras

Con eso, el campo se siente estable y el codigo queda mas facil de mantener. Un ejemplo simple:

import { useId, useState } from "react";

const basicEmail = /\S+@\S+\.\S+/;

export function EmailField() {
  const hintId = useId();
  const [value, setValue] = useState("");
  const [touched, setTouched] = useState(false);

  const formatError =
    touched && value.length > 0 && !basicEmail.test(value)
      ? "Revisa el formato del email."
      : "";

  return (
    <label className="field">
      <span>Email</span>
      <input
        type="email"
        value={value}
        onChange={(e) => setValue(e.target.value)}
        onBlur={() => setTouched(true)}
        aria-invalid={formatError ? "true" : "false"}
        aria-describedby={hintId}
      />
      <span id={hintId} className="hint">
        {formatError || "Usaremos este email para acceso y recuperacion."}
      </span>
    </label>
  );
}
Enter fullscreen mode Exit fullscreen mode

No hace magia, pero evita esa sensacion medio brusca que aparece cuando el formulario te corrige en cada tecla. Tambien deja un hueco natural para sumar reglas de dominio despues. Si tu equipo ya trabajo estados de carga claros en flujos de email, la misma idea aplica aqui: feedback temprano, pero no invasivo.

CSS que ayuda sin gritar

Mucho del problema no esta en la validacion sino en como se dibuja. Si el texto aparece y desaparece empujando botones, o si todo se pinta rojo al primer fallo, el campo se siente inestable. Un poco de CSS bien puesto arregla bastante:

.field {
  display: grid;
  gap: 0.35rem;
}

.field .hint {
  min-height: 1.25rem;
  color: #b42318;
}

.field input {
  border: 1px solid #b8c0cc;
  border-radius: 0.75rem;
  padding: 0.75rem 0.875rem;
}

.field input[aria-invalid="true"] {
  border-color: #b42318;
  box-shadow: 0 0 0 4px rgba(180, 35, 24, 0.12);
}
Enter fullscreen mode Exit fullscreen mode

Reservar altura para la ayuda evita reflow y hace que mobile se sienta mas limpio. Es un detalle chico, pero cambia mucho el tono del formulario. Varias veces vi productos mejorar sin tocar backend, solo quitando sobresaltos visuales. Es de esas mejoras que no lucen epicas, pero rinden bastante.

Cuando revisar correo temporal si tiene sentido

No bloquearia direcciones temporales en el primer render. Primero porque algunas se usan para QA legitima, y segundo porque la interfaz no deberia resolver sola una politica que quizas pertenece al backend. Mi regla suele ser esta:

  • el cliente avisa
  • la API decide
  • el mensaje explica el motivo

Si el equipo quiere revisar servicios efimeros como referencia, algo tipo tempmailso puede servir para conversaciones internas o pruebas controladas, no necesariamente para endurecer el copy visible al usuario. Lo importante es que el mensaje diga que se necesita un email al que la persona pueda volver mas tarde. Eso suena mas humano y menos policial, aunque no sea una frase perfectisima.

Tambien ayuda estudiar otros flujos donde el email afecta medicion y onboarding. Este post sobre probar correos de onboarding sin ensuciar metricas me gusta porque recuerda que el problema no es solo capturar un dato: tambien es separar pruebas, producto y lectura de resultados. A veces ese cruce se olvida, y luego el equipo persigue falsos problemas por semanas.

Q&A rapido

¿Conviene validar mientras la persona escribe?

Solo lo minimo. Formato basico, si acaso. Las reglas mas estrictas en cada tecla suelen sentirse pesadas y aveces hasta injustas.

¿Debo bloquear todos los correos temporales?

No necesariamente. Si el riesgo es bajo, advertir puede funcionar mejor que bloquear. Bloquear por defecto parece serio, pero aveces solo mueve la friccion a soporte.

¿Por que tanto cuidado con el texto de ayuda?

Porque ese texto hace de puente entre regla tecnica y expectativa humana. Si es agresivo, el formulario se siente torpe. Si es claro y estable, todo el flujo respira mejor.

Top comments (0)