A complete form validation hook for React

LX React Form

Notas de atualização

1.1.3

  • Fix: Correção de pequenos bugs
  • Feat: Lançamento da feature de steps (formulários em etapa)

1.0.2

  • Fix: (Essencial) Correção de bugs que impediam o envio de select e checkbox na função handleSubmit

O LX React Form é uma biblioteca brasileira de formulários para React criado em formato de hook.

Leve flexível e com diversas features a disposição, como: validação de diversos tipos de campos (input, checkbox, select), possibilidade de validação com regex, máscaras (padrões e costumizadas) e muito mais.

Instalação

Você pode instalar o LX React Form como um pacote NPM utilizando o comando

npm install lx-react-form

ou

yarn add lx-react-form

Exemplo completo

import { useForm, useInput } from "lx-react-form";

const name = useInput({
  name: "name",
});

const email = useInput({
  name: "name",
  validation: "email",
});

const password = useInput({
  name: "password",
  validation: "senha",
});

const form = useForm({
  clearFields: true,
  formFields: [name, email, password],
  submitCallback: (formData) => {
    console.log(formData);
  },
});

return (
  <form onSubmit={form.handleSubmit}>
    <input type="text" {...name.inputProps} />
    {name.error && <p>{name.error}</p>}

    <input type="email" {...email.inputProps} />
    {email.error && <p>{email.error}</p>}

    <input type="password" {...password.inputProps} />
    {password.error && <p>{password.error}</p>}

    <button type="submit">Enviar</button>
  </form>
);

(useInput) – Validações de input (text, email, number) ou textarea

Você pode validar esses tipos de campo com o hook useInput

import { useInput } from "lx-react-form";

const example = useInput({
  name: "example",
  validation: "telefone",
  mask: "telefone",
});

return (
  <form>
    <input type="text" {...example.inputProps} maxLength="15" />
    {example.error && <p>{example.error}</p>}
  </form>
);

Confira abaixo todas as opções disponíveis para o hook useInput

Opções Obrigatório Descrição
name Sim* O nome do campo é essencial para identificação tanto no HTML quanto no hook useForm
optional Não Define se o campo é opcional ou não, padrão false.
initialValue Não Define um valor inicial para o campo
same Não Permite relacionar campos, para exigir que o valor dos mesmos precise corresponder
minLength Não O número de caracteres mínimo para o respectivo campo
validation Não Utiliza uma validação padrão disponível: email, cep, senha, telefone
customValidation Não Permite a utilização de regex próprio para validação
mask Não Utiliza uma máscara padrão disponível: cep, cpf, cnpj, telefone, inteiros
customMask Não Permite o uso de uma máscara customizada
errorText Não Permite customizar a mensagens de erro de padrão: required, same e minLength

Exemplo same

import { useInput } from "lx-react-form";

const password = useInput({
  name: "password",
  validation: "senha",
});

const confirmpassword = useInput({
  name: "confirmpassword",
  same: password.value,
});

return (
  <form>
    <input type="password" {...password.inputProps} />
    {password.error && <p>{password.error}</p>}

    <input type="password" {...confirmpassword.inputProps} />
    {confirmpassword.error && <p>{confirmpassword.error}</p>}
  </form>
);

Exemplo customValidation

Valida o campo comparando ao regex fornecido

import { useInput } from "lx-react-form";

const password = useInput({
  name: "password",
  customValidation: {
    regex: /^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{8,}$/,
    error:
      "Sua senha precisa conter 8 caracteres, pelo menos uma letra e um número",
  },
});

return (
  <form>
    <input type="password" {...password.inputProps} />
    {password.error && <p>{password.error}</p>}
  </form>
);

Exemplo customMask

Aplica a máscara fornecida ao campo

import { useInput } from "lx-react-form";

const birthDate = useInput({
  name: "birthdate",
  customMask: {
    expressions: [
      {
        regex: /\D/g,
        replace: "",
      },
      {
        regex: /(\d{2})(\d)/,
        replace: "$1/$2",
      },
      {
        regex: /(\d{2})(\d{4})/,
        replace: "$1/$2",
      },
    ],
  },
});

return (
  <form>
    <input type="text" {...birthDate.inputProps} maxLength="10" />
    {birthDate.error && <p>{birthDate.error}</p>}
  </form>
);

Exemplo alterando errorText

Configurando as mensagens de erro padrão

import { useInput } from "lx-react-form";

const password = useInput({
  name: "password",
  errorText: {
    required: "This field is required",
    same: "Confirm password must match with password",
    minLength: "Password must contain at least 8 characters",
  },
});

return (
  <form>
    <input type="password" {...password.inputProps} />
    {password.error && <p>{password.error}</p>}
  </form>
);

(useCheckbox) – Validações de checkbox (type checkbox)

Você pode validar checkbox com o hook useCheckbox

import { useCheckbox } from "lx-react-form";

const example = useCheckbox({
  name: "privacy",
});

return (
  <form>
    <label htmlFor={example.name}>
      <input type="checkbox" {...example.inputProps} />
      <span>Eu aceito a política de privicidade</span>
    </label>
    {example.error && <p>{example.error}</p>}
  </form>
);

Confira abaixo todas as opções disponíveis para o hook useCheckbox

Opções Obrigatório Descrição
name Sim* O nome do campo é essencial para identificação tanto no HTML quanto no hook useForm
optional Não Define se o campo é opcional ou não, padrão false.
initialValue Não Define um valor inicial para o campo (precisa ser obrigatoriamente true ou false)
errorText Não Permite customizar a mensagens de erro de padrão: required

(useSelect) – Validações de select

Você pode validar select com o hook useSelect

import { useSelect } from "lx-react-form";

const example = useSelect({
  name: "ocupation",
});

return (
  <form>
    <select {...example.inputProps}>
      <option value="">Selecione uma ocupação</option>
      <option value="pedreiro">Pedreiro</option>
      <option value="padeiro">Padeiro</option>
    </select>
    {example.error && <p>{example.error}</p>}
  </form>
);

Confira abaixo todas as opções disponíveis para o hook useSelect

Opções Obrigatório Descrição
name Sim* O nome do campo é essencial para identificação tanto no HTML quanto no hook useForm
optional Não Define se o campo é opcional ou não, padrão false.
initialValue Não Define um valor inicial para o campo
errorText Não Permite customizar a mensagens de erro de padrão: required

(useForm) – hook para gerar a função de envio dos formulários

O useForm condensa os campos em única lista e executa todas as validações antes de executar a função de envio

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

const form = useForm({
  clearFields: true,
  formFields: [campo1, campo2, campo3],
  submitCallback: (formData) => {
    console.log(formData);
  },
});

return (
  <form onSubmit={form.handleSubmit}>
    <input type="text" {...name.inputProps} />
    {name.error && <p>{name.error}</p>}

    <input type="email" {...email.inputProps} />
    {email.error && <p>{email.error}</p>}

    <input type="password" {...password.inputProps} />
    {password.error && <p>{password.error}</p>}

    <button type="submit">Enviar</button>
  </form>
);
Opções Obrigatório Descrição
clearFields Não Limpa os campos após um envio bem sucedido do formulário
formFields Sim* Lista de campos do formulário (se refere aos hooks instaciados)
submitCallback Não Função de callback do envio, recebe como parâmetro padrão formData contendo um objeto com todos os campos e valores

Formulários de etapas – uso avançado do useForm

Com o useForm é possível, além da criação de formulários convencionais, formulários com etapas

import { useForm, useInput } from "lx-react-form";

const name = useInput({
  name: "name",
});

const email = useInput({
  name: "name",
  validation: "email",
});

const password = useInput({
  name: "password",
  validation: "senha",
});

const form = useForm({
  clearFields: true,
  stepFields: {
    0: [name, email],
    1: [password],
  }
  formFields: [name, email, password],
  submitCallback: (formData) => {
    console.log(formData);
  },
});

return (
  <form onSubmit={form.handleSubmit}>
    {form.step === 0 && (
      <>
        <input type="text" {...name.inputProps} />
        {name.error && <p>{name.error}</p>}

        <input type="email" {...email.inputProps} />
        {email.error && <p>{email.error}</p>}

        <button type="button" onClick={form.nextStep}>
          Avançar
        </button>
      </>
    )}

    {form.step === 1 && (
      <>
        <input type="password" {...password.inputProps} />
        {password.error && <p>{password.error}</p>}

        <button type="button" onClick={form.previousStep}>
          Voltar
        </button>

        <button type="submit">Enviar</button>
      </>
    )}
   
  </form>
);
Opções Obrigatório Descrição
stepFields Sim* Um objeto contendo uma lista de campos para cada etapa do formulário
stepMode Não No modo onChange, permite que as validações aconteçam (sem notificação de erro) a cada alteração mínima de campo (pode servir para liberar os botões de avançar e enviar somente quando todos os requisitos estiverem preenchidos)
stepClearFieldsOnBack Não A função previousStep limpa os campos da etapa respectiva

Exemplo de etapas com stepMode onChange

import { useForm, useInput } from "lx-react-form";

const name = useInput({
  name: "name",
});

const email = useInput({
  name: "name",
  validation: "email",
});

const password = useInput({
  name: "password",
  validation: "senha",
});

const form = useForm({
  clearFields: true,
  stepMode: "onChange"
  stepFields: {
    0: [name, email],
    1: [password],
  }
  formFields: [name, email, password],
  submitCallback: (formData) => {
    console.log(formData);
  },
});

return (
  <form onSubmit={form.handleSubmit}>
    {form.step === 0 && (
      <>
        <input type="text" {...name.inputProps} />
        {name.error && <p>{name.error}</p>}

        <input type="email" {...email.inputProps} />
        {email.error && <p>{email.error}</p>}

        {form.canProceed && (
          <button type="button" onClick={form.nextStep}>
            Avançar
          </button>
        )}
      </>
    )}

    {form.step === 1 && (
      <>
        <input type="password" {...password.inputProps} />
        {password.error && <p>{password.error}</p>}

        <button type="button" onClick={form.previousStep}>
          Voltar
        </button>
        {form.canProceed && (
          <button type="submit">Enviar</button>
        )}
      </>
    )}   
  </form>
);

This is LX React Form!

GitHub

View Github