Criando formulários no React com Formik
Criar formulários no React é uma verdadeira dor de cabeça. Precisamos lidar com todas as mudanças de valor. Para caixas de texto de entrada, precisamos obter o valor e atualizar o estado com nosso próprio código. Para outros controles de formulário, como caixas de seleção e botões de opção, ainda é mais difícil.
Uma biblioteca que ajuda a facilitar nossas vidas é o Formik . Neste artigo, veja como usar o Formik no nosso aplicativo React for create fomulários.
Começando
Para começar, primeiro instale ou pacote Formik NPM.
Faz o seguinte comando:
yarn add formik
Em seguida, podemos começar a criar nosso formulário.
Para fazer isso, incluir ou incluir um Formik
componente no nosso aplicativo, que pode usar nossos componentes de controle de formulário dentro dele.
Então, o estado será atualizado sem escrever muito código.
Para criar um formulário simples, podemos escrever:
import React from "react";
import { Formik } from "formik";
export default function App() {
return (
<div className="App">
<Formik
initialValues={{ firstName: "", lastName: "" }}
validate={values => {
const errors = {};
if (!values.firstName) {
errors.firstName = "Required";
}
return errors;
}}
onSubmit={(values, { setSubmitting }) => {
alert(JSON.stringify(values, null, 2));
setSubmitting(false);
}}
>
{({
values,
errors,
touched,
handleChange,
handleBlur,
handleSubmit,
isSubmitting
}) => (
<form onSubmit={handleSubmit}>
<input
type="text"
name="firstName"
onChange={handleChange}
onBlur={handleBlur}
value={values.firstName}
/>
<br />
{errors.firstName && touched.firstName && errors.firstName}
<br />
<input
type="text"
name="lastName"
onChange={handleChange}
onBlur={handleBlur}
value={values.lastName}
/>
<br />
{errors.lastName && touched.lastName && errors.lastName}
<br />
<button type="submit" disabled={isSubmitting}>
Submit
</button>
</form>
)}
</Formik>
</div>
);
}
Nenhum código acima, adiciona ou Componente Formik
, que possui vários acessórios.
O initialValue
nos permite especificar os valores dos campos do formulário.
O validate
nos permite especificar regras de validação.
É uma função que pega os valores e vamos retornar um objeto errors
com a chave sendo a chave do valor do formulário e o valor sendo a mensagem de erro.
onSubmit
é uma função que executa quando clique em Enviar.
Tudo o que fazemos é mostrar uma caixa de alerta com os valores inseridos para simplificar as coisas neste exemplo.
O setSubmitting
é uma função chamada para informar ao Formik se estamos enviando ou não.
Se terminarmos, passaremos false
para setSubmitting
o que fizemos acima.
A função que passamos para o onSubmit
não será chamada até que todos os campos do formulário tenham dados válidos.
Dentro do Formik
temos uma função com um parâmetro de objeto com muitas propriedades.
E retornamos nosso elemento de formulário, que possui 2 controles de texto de entrada.
O handleChange
parâmetro possui o manipulador de alterações que precisamos para lidar com qualquer alteração no valor do formulário.
O handleSubmit
possui nosso manipulador de envio que definimos no onSubmit
.
handleBlur
possui o onBlur
manipulador para o elemento do formulário.
Exibimos os objetos de erro depois que o controle de entrada é tocado e o objeto error
é preenchido.
Também isSubmitting
é um parâmetro útil que nos permite saber se o formulário está sendo enviado ou não.
Se estiver sendo enviado, podemos desabilitar o botão Enviar para que não possamos enviar novamente.
values
tem o valor do formulário que podemos definir como o valor dos nossos elementos de entrada.
Tornando as coisas mais simples
Felizmente, não precisamos escrever todo esse código explicitamente todas as vezes.
Formik nos fornece os componentes Form
, Field
e ErrorMessage
para que possamos construir formulários, campos de formulário e mensagens de erro de exibição, respectivamente.
Podemos simplificar nosso exemplo anterior escrevendo:
import React from "react";
import { Formik, Form, Field, ErrorMessage } from "formik";
function App() {
return (
<div className="App">
<Formik
initialValues={{ firstName: "", lastName: "" }}
validate={values => {
const errors = {};
if (!values.firstName) {
errors.firstName = "Required";
}
return errors;
}}
onSubmit={(values, { setSubmitting }) => {
setTimeout(() => {
alert(JSON.stringify(values, null, 2));
setSubmitting(false);
}, 400);
}}
>
{({ isSubmitting }) => (
<Form>
<Field type="text" name="firstName" />
<br />
<ErrorMessage name="firstName" component="div" />
<br />
<Field type="text" name="lastName" />
<br />
<ErrorMessage name="lastName" component="div" />
<br />
<button type="submit" disabled={isSubmitting}>
Submit
</button>
</Form>
)}
</Formik>
</div>
);
}
export default App;
Nós simplificamos muito com os Form
, Field
e ErrorMessage
que vêm com Formik.
Os campos estão no componente Form
.
O Field
possui nossas entradas de formulário.
E os ErrorMessage
têm as mensagens que são exibidas.
A única propriedade passamos dentro do Formik
é a isSubmitting
. Ainda o usamos para definir o disabled
do botão, como fizemos no exemplo anterior.
Hooks API
Como as bibliotecas React mais populares, o Formik também vem com uma API baseada em hooks.
O Formik possui o hook useFormik
, que retornam uma função que podemos usar em nossos próprios formulários para manipular alterações de valor de formulário, exibir mensagens de erro e enviar formulários.
Podemos usar o hook useFormik
da seguinte maneira:
import React from "react";
import { useFormik } from "formik";
const validate = values => {
const errorMsg = "Must be 20 characters or less";
const errors = {};
if (!values.firstName) {
errors.firstName = "Required";
} else if (values.firstName.length > 20) {
errors.firstName = errorMsg;
}
if (!values.lastName) {
errors.lastName = "Required";
} else if (values.lastName.length > 20) {
errors.lastName = errorMsg;
}
return errors;
};
const App = () => {
const formik = useFormik({
initialValues: {
firstName: "",
lastName: ""
},
validate,
onSubmit: values => {
alert(JSON.stringify(values, null, 2));
}
});
return (
<form onSubmit={formik.handleSubmit}>
<label htmlFor="firstName">First Name</label>
<input
id="firstName"
name="firstName"
type="text"
onChange={formik.handleChange}
value={formik.values.firstName}
/>
{formik.errors.firstName ? <div>{formik.errors.firstName}</div> : null}
<br />
<label htmlFor="lastName">Last Name</label>
<input
id="lastName"
name="lastName"
type="text"
onChange={formik.handleChange}
value={formik.values.lastName}
/>
{formik.errors.lastName ? <div>{formik.errors.lastName}</div> : null}
<br />
<button type="submit">Submit</button>
</form>
);
};
export default App;
Separamos a função validate
movendo-a para fora do App
componente.
O mecanismo de validação é o mesmo. Verificamos o valor dos campos do formulário especificados como chaves da propriedade initialValue
.
Em App
, chamamos o hook useFormik
passando um objeto com a propriedade initialValues
, nossa função validate
e nossa função onSubmit
, que serão chamadas se todos os valores inseridos forem válidos.
Ele retorna o objeto formik
, que tem as propriedades handleSubmit
, handleChange
, errors
e values
, que são todos o mesmo como nos exemplos anteriores.
O benefício do uso useFormik
é que podemos mover nossa parte validate
externa para fora de nosso componente.
Além disso, os métodos e propriedades de retorno podem ser usados da maneira que desejar em nossos formulários.
Isso significa que não precisamos escrever tudo explicitamente e não usar os componentes incorporados ao Formik, que são bastante restritivos.
Temos uma sintaxe limpa e flexível ao mesmo tempo com ganchos de API.
Concluindo
O Formulário é uma biblioteca fácil de usar, que permite adicionar formulários a uma aplicação Reagir com validação de formulários, sem a necessidade de lidar com os valores dos formulários.
Além disso, ele retorna erros de validação do formulário automaticamente, para que não tenhamos que lidar com eles mesmos.
Os ganchos que acompanham ou o Formik nos oferece mais flexibilidade na maneira como podemos criar nossos formulários no aplicativo React.