Gerenciando Formulários com React Hook Form e Zod

Desenvolver formulários em aplicações React é uma tarefa comum, mas pode ser desafiadora, especialmente ao lidar com formulários complexos que requerem validação e gerenciamento avançados. Neste artigo, vamos explorar como utilizar o React Hook Form e Zod em conjunto para simplificar e tornar mais eficiente o processo de desenvolvimento de formulários em aplicações React.

O que são o React Hook Form e Zod?

O React Hook Form é uma biblioteca leve e eficiente para lidar com formulários em aplicações React. Ele utiliza hooks do React para gerenciar o estado do formulário de forma eficiente, evitando a necessidade de renderizações desnecessárias.

Zod, por outro lado, é uma biblioteca de validação de esquemas que permite definir e validar esquemas de dados de forma simples e declarativa. Ele é altamente compatível com o React Hook Form e pode ser facilmente integrado para validar os dados do formulário.

Configuração Inicial

Para começar, instale as bibliotecas necessárias em seu projeto:

npm install react-hook-form zod @hookform/resolvers/zod

Exemplo Simples: Formulário de Login

Vamos começar com um exemplo simples de um formulário de login que coleta o e-mail e a senha do usuário.

import { useForm } from 'react-hook-form';
import { zodResolver } from '@hookform/resolvers/zod';
import { z } from 'zod';

const schema = z.object({
  email: z.string().email(),
  password: z.string().min(8),
});

type LoginFormInputs = z.infer<typeof schema>;

const LoginForm = () => {
  const { register, handleSubmit, formState: { errors } } = useForm<LoginFormInputs>({
    resolver: zodResolver(schema),
  });

  const onSubmit = (data: LoginFormInputs) => {
    console.log(data);
  };

  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      <input {...register('email')} />
      {errors.email && <span>{errors.email.message}</span>}
      
      <input type="password" {...register('password')} />
      {errors.password && <span>{errors.password.message}</span>}
      
      <button type="submit">Submit</button>
    </form>
  );
};

export default LoginForm;

Este é um exemplo básico de uso do React Hook Form e Zod para validar e gerenciar um formulário simples de login.

Exemplo Complexo: Formulário de Cadastro de Usuário

Agora, vamos criar um exemplo mais complexo de um formulário de cadastro de usuário que coleta informações como nome, e-mail, senha e data de nascimento.

import { useForm } from 'react-hook-form';
import { zodResolver } from '@hookform/resolvers/zod';
import { z } from 'zod';

const schema = z.object({
  name: z.string().min(3).max(50),
  email: z.string().email(),
  password: z.string().min(8),
  dob: z.date().refine((value) => {
    const minDate = new Date('1900-01-01');
    const maxDate = new Date();
    return value >= minDate && value <= maxDate;
  }, 'Data de nascimento inválida'),
});

type SignupFormInputs = z.infer<typeof schema>;

const SignupForm = () => {
  const { register, handleSubmit, formState: { errors } } = useForm<SignupFormInputs>({
    resolver: zodResolver(schema),
  });

  const onSubmit = (data: SignupFormInputs) => {
    console.log(data);
  };

  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      <input {...register('name')} />
      {errors.name && <span>{errors.name.message}</span>}
      
      <input {...register('email')} />
      {errors.email && <span>{errors.email.message}</span>}
      
      <input type="password" {...register('password')} />
      {errors.password && <span>{errors.password.message}</span>}
      
      <input type="date" {...register('dob')} />
      {errors.dob && <span>{errors.dob.message}</span>}
      
      <button type="submit">Submit</button>
    </form>
  );
};

export default SignupForm;

Este exemplo mostra como utilizar o React Hook Form e Zod para lidar com um formulário de cadastro de usuário mais complexo, que inclui validação de data de nascimento com uma data mínima e máxima permitida.

Benefícios e Recursos Adicionais

Ao utilizar o React Hook Form e Zod em seus projetos React, você pode obter os seguintes benefícios:

  • Declarativo: O React Hook Form e Zod permitem definir e validar esquemas de dados de forma declarativa, tornando o código mais legível e fácil de entender.
  • Eficiente: O React Hook Form utiliza o conceito de "regras" para acionar renderizações apenas quando necessário, o que melhora significativamente o desempenho do aplicativo.
  • Flexibilidade: O React Hook Form oferece uma ampla gama de ganchos personalizáveis para atender às necessidades específicas de diferentes tipos de formulários.

Além disso, aqui estão alguns recursos adicionais que podem ajudá-lo a aprender mais sobre o React Hook Form e Zod:

Conclusão

O React Hook Form e Zod são ferramentas poderosas para simplificar e tornar mais eficiente o processo de lidar com formulários em aplicações React. Ao utilizar essas bibliotecas, os desenvolvedores podem escrever menos código, enquanto mantêm um alto nível de controle e flexibilidade sobre o comportamento e a validação dos formulários.

Experimente utilizar o React Hook Form e Zod em seus projetos React para uma experiência de desenvolvimento de formulários mais eficiente e agradável!