npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

lx-react-form

v1.3.5

Published

- Fix: arrumando tipagem do maxLength

Downloads

28

Readme

LX React Form

Notas de atualização

1.3.5

  • Fix: arrumando tipagem do maxLength

1.3.4

  • Fix: arrumando problema em custom validations

1.3.2

  • Feat: regra customizada para useInput e useNumber (é possível criar a propria regra de validação)

1.3.0

  • Feat: agora é possível validar multiplas vezes um mesmo campo com regex
  • Fix: máscara de CNPJ corrigida

1.2.2

  • Feat: stepCallbacks (execução de função a cada avanço de etapa)
  • Feat: maxLength para o hook useInput

1.2.1

  • Feat: melhorando comportamento de validação

1.2.0

  • Refactor: Código raiz refatorado para Typescript
  • Feat: novos hooks useCheckboxGroup, useRadio e useNumber

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: "email",
  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",
  maxLength: 15,
  validation: "telefone",
  mask: "telefone",
});

return (
  <form>
    <input type="text" {...example.inputProps} />
    {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 | | maxLength | Não | O número de caracteres máximo para o respectivo campo | | validation | Não | Utiliza uma validação padrão disponível: email, cep, senha, telefone | | customValidations | 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 | | customRule | Não | Objeto contendo função callback com regra customizada e mensagem de erro |

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",
  customValidations: [
    {
      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",
  minLenght: 10,
  maxLength: 10,
  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} />
    {birthDate.error && <p>{birthDate.error}</p>}
  </form>
);

Exemplo customRule

É possível criar uma regra customizada de validação

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

const batatinha = useInput({
  name: "batatinha",
  customRule: {
    callback: (value) => {
      if(value === "batatinha"){
        return true;
      } else {
        return false;
      }
    },
    error: 'Este campo não é uma batatinha!'
  }
});

return (
  <form>
    <input type="password" {...password.inputProps} />
    {password.error && <p>{password.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>
);

(useNumber) - hook para validar input núméricos

Você pode validar input númericos com useNumber

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

const age = useNumber({
  name: "age",
  min: 18,
  max: 65,
});

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

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

| 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. | | min | Não | Número mínimo | | max | Não | Número máximo | | 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, min e max | | customRule | Não | Objeto contendo função callback com regra customizada e mensagem de erro |

(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 |

(useCheckboxGroup) - hook para validar multiplos grupos de checkbox

Você pode validar grupos de checkbox com useCheckboxGroup (considerando o grupo com um único item do formulário)

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

const categories = useCheckboxGroup({
  initialValue: ["acao"],
  name: "categories",
  min: 1,
  max: 3,
});

return (
  <form>
    <div>
      <label>
        Ação
        <input
          type="checkbox"
          value="acao"
          {...categories.inputProps}
          checked={categories.value.includes("acao") ? true : false}
        />
      </label>

      <label>
        Comédia
        <input
          type="checkbox"
          value="comedia"
          {...categories.inputProps}
          checked={categories.value.includes("comedia") ? true : false}
        />
      </label>

      <label>
        Drama
        <input
          type="checkbox"
          value="drama"
          {...categories.inputProps}
          checked={categories.value.includes("drama") ? true : false}
        />
      </label>

      <label>
        Terror
        <input
          type="checkbox"
          value="terror"
          {...categories.inputProps}
          checked={categories.value.includes("terror") ? true : false}
        />
      </label>
    </div>
    {categories.error && <p>{categories.error}</p>}
  </form>
);

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

| 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. | | min | Não | Número mínimo necessário de checkbox marcados | | max | Não | Número máximo necessário de checkbox marcados | | 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, min e max |

(useRadio) - hook para validar grupos de radio

Você pode validar grupos de radio com useRadio (considerando o grupo com um único item do formulário)

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

const biscuit = useCheckboxGroup({
  name: "biscuit",
});

return (
  <form>
    <div>
      <label>
        Bolacha
        <input
          type="radio"
          value="bolacha"
          {...biscuit.inputProps}
          checked={biscuit.includes("bolacha") ? true : false}
        />
      </label>

      <label>
        Biscoito
        <input
          type="radio"
          value="biscoito"
          {...biscuit.inputProps}
          checked={biscuit.includes("biscoito") ? true : false}
        />
      </label>
    </div>
    {biscuit.error && <p>{biscuit.error}</p>}
  </form>
);

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

| 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 |

(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: "email",
  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 | | stepCallbacks | Não | Um objeto contendo um função de callback 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: "email",
  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!