fbpx

React: Formulários e Validação com React Hook Form

Fala, pessoal! Neste post vou mostrar como trabalhar com formulários e validação no React, de forma simples e eficiente, usando a biblioteca React Hook Form.

React Forms

React Hook Form x Formik x Redux Form

O React Hook Form trouxe algumas melhorias em relação a outras bibliotecas de manipulação de formulários no React, como a Formik e a Redux Form.

Entre estes pontos estão a validação embutida (com outras libs você precisa fazer a validação manualmente ou instalar mais uma lib pra isso), performance (ela faz menos renders que outras libs ao alterar os campos) e facilidade de uso (com a React Hook Form você precisa escrever menos código e a curva de aprendizagem é menor).

E as duas cerejas no bolo: ele funciona com React Native, com poucas alterações, e para quem usa TypeScript, ela já vem com as próprias definições de tipos.

Exemplo: Formulário de Login

Vamos ver na prática como trabalhar com a React Hook Form construindo um formulário de login.

Pra começar, vamos criar um componente LoginForm basicão, com os campos e-mail e senha:

import React from "react";
import "./LoginForm.css";

const LoginForm = () => {
  return (
    <div className="login-form">
      <form>
        <label htmlFor="inputEmail">E-mail</label>
        <input
          type="email"
          id="inputEmail"
          name="email"
        />

        <label htmlFor="inputPassword">Password</label>
        <input
          type="password"
          id="inputPassword"
          name="password"
        />

        <button type="submit">Login</button>
      </form>
    </div>
  );
};

export default LoginForm;

Agora vamos instalar o React Hook Form:

npm i react-hook-form

E importar o hook useForm no nosso componente:

import { useForm } from "react-hook-form";

Dentre as propriedades que esse hook retorna, vamos precisar de handleSubmit, register e errors:

const { register, handleSubmit, errors } = useForm();

Registrando os campos

A primeira propriedade, register, é uma função que registra os campos. Você precisa registrar cada campo que deseja que seja gerenciado pelo React Hook Form, através da prop ref do campo:

<input name="email" ref={register()} />

Recuperando os dados ao enviar o formulário

A próxima propriedade, handleSubmit, é usada para tratar o envio do formulário e capturar os dados preenchidos.

const LoginForm = () => {
  const { register, handleSubmit, errors } = useForm();

  function onSubmit(data) {
    console.log("Data submitted: ", data);
  }

  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      //... campos do formulário
    </form>
  );
}

A nossa função onSubmit vai receber um objeto com os dados do formulário, e nesse momento podemos enviar os dados para alguma api do backend ou fazer o que quisermos com eles.

Validando e mostrando os erros

Para adicionar validação nos campos precisamos passar alguns parâmetros para a função register, informando as regras de validação e as mensagens de erro, caso a validação não passe.

Veja como fica nosso campo de e-mail:

<input
  type="email"
  name="email"
  ref={register({
    required: "Enter your e-mail",
    pattern: {
      value: /^[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}$/i,
      message: "Enter a valid e-mail address",
    },
   })}
 />

Temos duas validações: a de campo obrigatório (required) e uma de expressão regular (pattern) para validar se o e-mail está no formato certo.

Com isso o React Hook Form já impede que o formulário seja enviado se algum campo falhar na validação.

Para exibir as mensagens de erro para o usuário, vamos usar a outra propriedade do hook: errors:

<input
  type="email"
  name="email"
  ref={register({
    required: "Enter your e-mail",
    pattern: {
      value: /^[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}$/i,
      message: "Enter a valid e-mail address",
    },
   })}
 />

{errors.email && <p className="error">{errors.email.message}</p>}

A propriedade errors vai ser preenchida automaticamente com os erros de cada campo, que podemos usar para mostrar uma mensagem abaixo de cada campo com erro. Também poderíamos usar para trocar alguma classe CSS e mudar o estilo dos campos com erro (adicionar um border vermelha, algum ícone, etc).

Conclusão

O código final deste exemplo está no GitHub: https://github.com/doug2k1/react-login-form

Veja abaixo uma demonstração do formulário em ação:

Tags:

Sobre o Autor

Douglas Matoso
Douglas Matoso

Desenvolvedor web desde 2008. Criador do Web Dev Drops.

2 Comentários

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *


  1. Douglas ótimo artigo mas tenho uma questão, como que faz para validar algo através de uma função? tipo validar o CPF da pessoa.

    Obrigado 😀

    • Obrigado pelo comentário, Igor!

      Para usar uma função de validação você pode usar a opção validate na hora de registrar. Exemplo:

      <input
        type="text"
        name="cpf"
        ref={register({
          validate: {
            validCPF: (value) => funcaoQueValidaCPF(value) || 'CPF inválido'
          }
         })}
       />