React Hooks Form: Crea formularios eficientes en React

Creando formularios en React con react-hook-form

La gestión de formularios en React puede volverse compleja rápidamente, especialmente cuando se introducen validaciones y lógica de envío. Implementar estas funcionalidades manualmente puede llevar a código repetitivo y a un rendimiento deficiente, con numerosos re-renders innecesarios. Afortunadamente, existen librerías como react-hook-form que simplifican el proceso de creación y manejo de formularios en React, brindando un código más limpio, eficiente y fácil de mantener.

react-hook-form se ha convertido en una de las librerías más populares para la creación de formularios en React, superando a otras como formik y react final form. Su popularidad se debe a varias ventajas:

  • Menor cantidad de re-renders: react-hook-form utiliza un enfoque de re-render optimizado, evitando re-renderizaciones innecesarias del formulario, lo que se traduce en un mejor rendimiento.
  • Código más conciso: La sintaxis de react-hook-form es más limpia y concisa en comparación con otras librerías, lo que facilita la escritura y la comprensión del código.
  • Integración con yup: react-hook-form se integra perfectamente con la librería yup, lo que permite definir esquemas de validación de datos de forma fácil y eficiente.
  • Tiempos de montaje más rápidos: Los formularios creados con react-hook-form se montan más rápido, mejorando la experiencia del usuario.

Un ejemplo básico sin librerías

Para entender mejor las ventajas de react-hook-form, primero veamos un ejemplo de formulario básico en React sin usar ninguna librería:

«`javascript
import React, { useState } from ‘react’;

function FormularioBasico() {
const [nombre, setNombre] = useState(»);
const [email, setEmail] = useState(»);
const [errors, setErrors] = useState({});

const handleSubmit = (event) => {
event.preventDefault();
if (nombre.trim() === ») {
setErrors({ nombre: ‘El nombre es obligatorio’ });
} else if (email.trim() === ») {
setErrors({ email: ‘El email es obligatorio’ });
} else {
// Enviar formulario
console.log(‘Formulario enviado:’, { nombre, email });
}
};

return (



{errors.nombre &&

{errors.nombre}

}



{errors.email &&

{errors.email}

}


);
}

export default FormularioBasico;
«`

LEER:  Animaciones JavaScript: Guía Completa para Principiantes

En este ejemplo, manejamos el estado de cada campo, validaciones y mensajes de error de forma manual. Al agregar más campos y validaciones, el código se vuelve más complejo y difícil de mantener.

Instalando react-hook-form

Para instalar react-hook-form, podemos usar npm o yarn:

bash
npm install react-hook-form

Creando un formulario simple con react-hook-form

Ahora, veamos cómo crear un formulario simple utilizando react-hook-form:

«`javascript
import React from ‘react’;
import { useForm } from ‘react-hook-form’;

function FormularioSimple() {
const { register, handleSubmit, formState: { errors } } = useForm();

const onSubmit = (data) => {
console.log(‘Formulario enviado:’, data);
};

return (



{errors.nombre &&

{errors.nombre.message}

}



{errors.email &&

{errors.email.message}

}


);
}

export default FormularioSimple;
«`

En este ejemplo, usamos el hook useForm para obtener las funciones register, handleSubmit y el objeto formState, que contiene información sobre el estado del formulario, incluyendo el objeto errors.

La función register se aplica a cada campo de entrada para rastrear cambios y validaciones. En este caso, usamos la opción required: true para indicar que el campo es obligatorio. La función handleSubmit se utiliza para gestionar el envío del formulario. Finalmente, el objeto errors contiene información sobre los errores de validación de cada campo.

Agregando validaciones a los campos

Podemos agregar más validaciones a los campos usando el objeto validate dentro de la función register:

«`javascript
import React from ‘react’;
import { useForm } from ‘react-hook-form’;

function FormularioValidaciones() {
const { register, handleSubmit, formState: { errors } } = useForm();

const onSubmit = (data) => {
console.log(‘Formulario enviado:’, data);
};

return (



{errors.nombre &&

{errors.nombre.message}

}



{errors.email &&

{errors.email.message}

}


);
}

export default FormularioValidaciones;
«`

En este ejemplo, hemos añadido una validación de longitud mínima al campo nombre. Si el nombre tiene menos de 3 caracteres, se mostrará un mensaje de error personalizado.

Refactorizando la gestión de errores

Para simplificar el código y mejorar la legibilidad, podemos refactorizar la gestión de errores utilizando un componente auxiliar:

LEER:  GDB Commands: Mastering the Art of Debugging with Powerful Tools

«`javascript
import React from ‘react’;
import { useForm } from ‘react-hook-form’;

const ErrorMensaje = ({ errors, name }) => {
if (errors[name]) {
return

{errors[name].message}

;
}
return null;
};

function FormularioValidacionesRefactorizado() {
const { register, handleSubmit, formState: { errors } } = useForm();

const onSubmit = (data) => {
console.log(‘Formulario enviado:’, data);
};

return (






);
}

export default FormularioValidacionesRefactorizado;
«`

Múltiples validaciones en un campo

Podemos agregar múltiples validaciones a un campo usando el objeto validate:

«`javascript
import React from ‘react’;
import { useForm } from ‘react-hook-form’;

function FormularioValidacionesMultiples() {
const { register, handleSubmit, formState: { errors } } = useForm();

const onSubmit = (data) => {
console.log(‘Formulario enviado:’, data);
};

return (




);
}

export default FormularioValidacionesMultiples;
«`

En este ejemplo, hemos agregado una nueva validación al campo nombre que verifica si el valor solo contiene letras.

Reiniciando los valores del formulario

Podemos reiniciar los valores del formulario usando la función reset:

«`javascript
import React from ‘react’;
import { useForm } from ‘react-hook-form’;

function FormularioReinicio() {
const { register, handleSubmit, formState: { errors }, reset } = useForm();

const onSubmit = (data) => {
console.log(‘Formulario enviado:’, data);
reset(); // Reinicia el formulario
};

return (




);
}

export default FormularioReinicio;
«`

Establecer valores iniciales con defaultValues

Podemos establecer valores iniciales para los elementos del formulario usando la opción defaultValues:

«`javascript
import React from ‘react’;
import { useForm } from ‘react-hook-form’;

function FormularioValoresIniciales() {
const { register, handleSubmit, formState: { errors }, reset } = useForm({
defaultValues: {
nombre: ‘John Doe’,
email: ‘john.doe@example.com’,
},
});

const onSubmit = (data) => {
console.log(‘Formulario enviado:’, data);
reset(); // Reinicia el formulario
};

return (






);
}

export default FormularioValoresIniciales;
«`

Usando el componente Controller con librerías externas

El componente Controller de react-hook-form se puede usar para trabajar con librerías externas como react-select:

«`javascript
import React from ‘react’;
import { useForm, Controller } from ‘react-hook-form’;
import Select from ‘react-select’;

LEER:  Registros de Assembly: Una Guía Detallada - IA-32

function FormularioConReactSelect() {
const { register, handleSubmit, control, formState: { errors } } = useForm();

const options = [
{ value: ‘chocolate’, label: ‘Chocolate’ },
{ value: ‘strawberry’, label: ‘Strawberry’ },
{ value: ‘vanilla’, label: ‘Vanilla’ },
];

const onSubmit = (data) => {
console.log(‘Formulario enviado:’, data);
};

return (



)}
/>
{errors.sabor &&

{errors.sabor.message}

}


);
}

export default FormularioConReactSelect;
«`

En este ejemplo, usamos Controller para controlar el componente react-select, permitiendo la validación y el manejo del estado del campo.

Trabajando con botones de radio y casillas de verificación

Podemos usar react-hook-form con botones de radio y casillas de verificación:

«`javascript
import React from ‘react’;
import { useForm } from ‘react-hook-form’;

function FormularioRadiosYCheckboxes() {
const { register, handleSubmit, formState: { errors }, reset } = useForm({
defaultValues: {
genero: ‘hombre’,
aceptaTerminos: false,
},
});

const onSubmit = (data) => {
console.log(‘Formulario enviado:’, data);
reset(); // Reinicia el formulario
};

return (



{errors.genero &&

{errors.genero.message}

}



{errors.aceptaTerminos && (

{errors.aceptaTerminos.message}

)}


);
}

export default FormularioRadiosYCheckboxes;
«`

En este ejemplo, hemos configurado los valores iniciales para los botones de radio y la casilla de verificación usando la opción defaultValues.

Conclusión

react-hook-form es una librería potente y eficiente para crear formularios en React. Ofrece un enfoque optimizado para la gestión de formularios, con un código conciso y fácil de mantener. Su integración con yup para validaciones de esquemas y sus rápidos tiempos de montaje hacen que sea una excelente opción para proyectos de cualquier tamaño.

Si quieres aprender más sobre react-hook-form y otras herramientas para construir aplicaciones React complejas y escalables, te invito a revisar mi curso Mastering Redux. En este curso, te enseñaré cómo usar Redux para manejar el estado de tu aplicación de forma eficiente y organizada, incluyendo la integración con Stripe para crear experiencias de pago seguras.