DEV Community

Silviu Technology
Silviu Technology

Posted on

React: valida email sin cambiar el ritmo

En formularios de registro, el campo de email suele romper el ritmo antes de que la persona termine de escribir. Aparece un borde rojo muy pronto, el boton cambia de estado, el texto de ayuda salta una linea y de golpe todo parece mas severo de lo necesario. No es un fallo grande, pero si va gastando confianza, y eso se nota bastante en mobile.

Cuando ademas quieres detectar una direccion de correo desechable, el riesgo crece. Muchas implementaciones meten formato, reglas de negocio y bloqueo visual en el mismo onChange. La interfaz queda inquieta, el formulario respira peor y el usuario siente que el producto lo esta corrigiendo todo el rato. En equipos frontend eso pasa mas de lo que deberia, la verdad.

Por que el campo de email corta el ritmo

El problema casi siempre viene de tres decisiones pequeñas:

  1. validar demasiado pronto
  2. mostrar el mismo mensaje para errores distintos
  3. mover el layout cada vez que cambia la ayuda

Ese combo castiga a gente que aun esta escribiendo. Si alguien va por ana@empresa..., no necesita una alerta agresiva; necesita terminar. Tambien conviene separar "formato invalido" de "dominio no aceptado para este flujo". Si mezclas ambas cosas, tus metricas quedan borrosas y el copy pierde precision.

Me gusta pensar el campo de email como una conversacion breve. Primero escuchas, luego confirmas, despues aplicas reglas. Si haces todo en el mismo instante, el componente se vuelve nervioso. Y ese nervio se transmite al usuario, aunque el equipo no lo vea enseguida.

Un patron de React para validar mas tarde

Una solucion simple en React es dividir responsabilidades por momento:

  1. onChange solo actualiza valor y limpia errores viejos
  2. onBlur revisa formato basico
  3. onSubmit ejecuta reglas mas caras o politicas del negocio

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

import { useId, useState } from "react";

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

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

  const formatError =
    touched && value && !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);
          setServerError("");
        }}
        onBlur={() => setTouched(true)}
        aria-invalid={formatError || serverError ? "true" : "false"}
        aria-describedby={hintId}
      />
      <span id={hintId} className="hint">
        {formatError || serverError || "Lo usaremos para acceso y recuperacion."}
      </span>
    </label>
  );
}
Enter fullscreen mode Exit fullscreen mode

No tiene nada exotico, pero baja friccion enseguida. Tambien deja hueco para sumar politicas mas adelante sin convertir el campo en una alarma permanente. Si te interesa seguir esta linea, el post sobre microestados que bajan la tension del formulario conecta muy bien con este mismo tipo de decision.

Detalles de accesibilidad que si cambian la experiencia

En Accessibility, los detalles visuales y semanticos importan mucho mas de lo que parece. Mi lista corta suele ser esta:

  • reservar altura para la ayuda y evitar reflow
  • no depender solo del color para marcar error
  • usar aria-describedby para unir input y mensaje
  • mantener un foco visible incluso en estado invalido

Un poco de CSS ya mejora bastante:

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

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

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

Parece un ajuste menor, pero evita saltos molestos y hace que el formulario se sienta mas confiable. He visto equipos ganar claridad sin tocar backend, solo dejando de mover el boton de submit cada vez que aparece un mensaje. Es una mejora poco dramatica, si, pero muy rentable.

Donde encajan las reglas sobre correos temporales

Las reglas sobre correo temporal conviene aplicarlas tarde y con contexto. El cliente puede advertir; la API deberia decidir. Eso evita falsos positivos cuando alguien usa una cuenta de QA o cuando el negocio realmente necesita dejar pasar ciertos casos de prueba. En tickets internos a veces aparecen terminos raros como tempail mail, y justo por eso no me gusta que el frontend tome decisiones definitivas con heuristicas flojas.

Si tu equipo necesita revisar un servicio de correo temporal gratis para pruebas controladas, o comparar comportamientos con tempmailso, mejor hacerlo como parte del flujo de validacion del backend y no como castigo instantaneo en la interfaz. Tambien puede tener sentido documentar estas excepciones en tus runbooks de email que no se rompen, para que soporte, producto y desarrollo entiendan la misma politica.

Otra pauta que me funciona es esta: el mensaje visible debe explicar necesidad, no sospecha. "Necesitamos un email al que puedas volver" suele funcionar mejor que "no aceptamos este tipo de direccion". Suena mas humano, menos brusco y evita esa sensacion de juicio que aveces aparece en onboarding.

Si luego el backend confirma que cierto dominio no sirve para activacion, entonces si puedes enlazar ayuda o sugerir una alternativa. Incluso ahi prefiero que el copy sea breve, casi seco, pero no hostil. Con otra referencia como tempmailso, lo importante es que el enlace viva dentro de contexto tecnico y no como relleno SEO medio obvio.

Q&A rapido

¿Conviene validar en cada tecla?

Solo lo minimo. Formato muy basico, como mucho. Todo lo demas suele meter ruido antes de tiempo.

¿Debo bloquear cualquier email temporal?

No siempre. Depende del riesgo del flujo y de si necesitas activacion real. Advertir a veces resuelve mejor que bloquear.

¿Que mejora primero la UX?

Separar formato, reglas de negocio y feedback visual. Ese corte parece pequeño, pero ordena mucho el componente y tambien la experiencia final.

Top comments (0)