Ejemplos funcionales de React Hook Form que puedes probar en la página: validación con Zod, comprobaciones asíncronas, field arrays, un asistente por pasos, subida de archivos, Controller y server actions de Next.js.
React Hook Form gestiona formularios de React con inputs no controlados: invoca useForm, aplica register("name") en cada input y envuelve tu función de envío en handleSubmit. Añade zodResolver para validar con un esquema de Zod. Los formularios de abajo funcionan en esta página: reglas, Zod, comprobaciones asíncronas, field arrays, un asistente, subida de archivos y server actions.
Instalación
Rellena cada demo, envíala con errores y luego corrígelos. El código de al lado es el que se ejecuta. Los errores se vinculan a sus inputs con aria-describedby y se anuncian con role="alert", así que los formularios también funcionan con lector de pantalla.
React Hook Form hace menos re-renders porque los inputs siguen sin controlar y lee los valores mediante refs. Formik guarda cada valor en el estado de React. En formularios grandes, React Hook Form suele ser más rápido y necesita menos código.
Instala zod y @hookform/resolvers, define un esquema z.object y pasa resolver: zodResolver(schema) a useForm. Usa z.infer<typeof schema> como tipo del formulario; los mensajes de error salen del esquema.
Invoca reset() dentro de tu handler de envío cuando el guardado tenga éxito, o pasa valores nuevos con reset(values). También puedes invocar reset en un effect cuando isSubmitSuccessful pase a true.
Los inputs HTML devuelven texto. Regístralo con valueAsNumber: true, o usa z.coerce.number() en un esquema de Zod, para obtener un número real.
Sí. shadcn/ui incluye un componente Form construido sobre el Controller de React Hook Form. Nuestra guía de formularios y tablas con shadcn lo explica con un ejemplo en vivo.
Las partes de la API que más vas a usar
register conecta un input por su nombre y acepta reglas al estilo HTML. errors guarda un mensaje por campo tras un envío fallido.
Un solo esquema te da las reglas de validación, los mensajes de error y el tipo de TypeScript. refine comprueba dos campos a la vez, y path indica qué campo recibe el error.
Una función validate puede devolver una promesa. Devuelve true cuando el valor es correcto, o una cadena que se mostrará como error. Combínala con el modo onBlur para que no se ejecute con cada tecla.
useFieldArray gestiona una lista dentro del formulario. Usa field.id como key, nunca el índice, para que React mantenga cada input unido a su fila.
Usa un solo formulario para todos los pasos e invoca trigger con los campos del paso actual antes de avanzar. Los valores de los pasos anteriores siguen en el formulario, así que el último envío lo tiene todo.
Un input de archivo se registra como cualquier otro; su valor es un FileList. Comprueba el tamaño y el tipo en validate y envía el archivo con FormData.
Los inputs que no exponen una ref, como muchos selectores de fecha y selects personalizados, se conectan mediante Controller. Este pasa value y onChange a tu componente.
Valida en el navegador para dar una respuesta rápida y de nuevo en el servidor, porque el navegador se puede saltar. Compartir un único esquema de Zod mantiene ambos sincronizados; setError muestra los problemas del servidor en el campo correcto.
¿Necesitas un formulario HTML simple? Consulta
Enviado:
Escribe tu nombre
Escribe tu email
Ese email no parece correcto
Enviando...
Enviar
Escribe un email válido
Al menos 8 caracteres
Las contraseñas no coinciden
Contraseña
Confirmar contraseña
Crear cuenta
Esta demo simula el servidor con una breve espera. Ocupados: admin, studio, hello.
Nombre de usuario
Elige un nombre de usuario
Ese nombre de usuario ya está ocupado
Comprobando...
Reservar
Diseño de logo
Nombre del artículo {n}
Cantidad del artículo {n}
Artículo
Quitar
Añadir artículo
Guardar
Obligatorio
Paso {n} de {total}
Empresa
Tamaño del equipo
Plan
Elige
Starter
Team
Rellena los campos resaltados.
Atrás
Siguiente
Finalizar
Logo (PNG o JPG, hasta 2 MB; se queda en tu navegador)
Elige un archivo
Máximo 2 MB
Solo PNG o JPG
Subir
Al menos 10
Presupuesto:
Empieza gratis · Sin tarjeta de crédito