DEV Community

Cover image for Formulário multi step com React
Dante J. Anjos
Dante J. Anjos

Posted on • Edited on

10

Formulário multi step com React

Este é um post com uma idéia de formulário multi step criado em ReactJS.

Formulários multi step são aqueles formulários divididos em etapas diferentes que o usuário vai preenchendo e seguindo um passo a passo.

Geralmente são feitos dessa forma para que o preenchimento não fique cansativo e chato com uma tela cheia de campos.
Um bom exemplo é um formulário de checkout, em que o usuário precisa inserir dados pessoais, de entrega e pagamento.

Vamos ao código

Primeiro vamos criar a estrutura dos passos do form:

const steps = [
  {
    id: 'PERSONAL',
    title: "Dados pessoais"
  },
  {
    id: 'SHIPPING',
    title: "Endereço de entrega"
  },
  {
    id: 'PAYMENT',
    title: "Dados de pagamento"
  }
];
Enter fullscreen mode Exit fullscreen mode

A idéia é bem simples. Um array com a lista de passos em que poderemos usar o index para navegar no formulário e exibir os inputs de acordo com o ID.

Vamos usar um state e uma função para renderizar o próximo passo:

const [currentStep, setCurrentStep] = useState(0);

function handleNextStep() {
  setCurrentStep((prevState) => prevState + 1);
}
Enter fullscreen mode Exit fullscreen mode

O state currentStep é iniciado com o valor de 0 para renderizar o primeiro item do array.

A função handleNextStep pega o valor atual do state currentStep e incrementa o valor, dessa forma irá renderizar o seguinte item do array.

Para renderizar os inputs no JSX podemos usar o valor do state e o ID do item para criar uma condição e exibir os campos do formulário.

{steps[currentStep].id === 'PERSONAL' && (
  <div className="fields">
    <div className="field">
      <input
        type="text"
        placeholder="Nome"
        name="name"
        onChange={handleInputChange}
        value={formValues.name}
      />
    </div>
    <div className="field">
      <input
        type="text"
        placeholder="E-mail"
        name="email"
        onChange={handleInputChange}
        value={formValues.email}
      />
    </div>
    <div className="field">
      <input
        type="text"
        placeholder="Telefone"
        name="phone"
        onChange={handleInputChange}
        value={formValues.phone}
      />
    </div>
  </div>
)}
Enter fullscreen mode Exit fullscreen mode

Para salvar os dados preenchidos podemos usar um state para todos os campos e uma função para setar esses valores de forma dinâmica.

const [formValues, setFormValues] = useState({
  name: "",
  email: "",
  phone: "",
});

function handleInputChange(event) {
  const { name, value } = event.target;

  setFormValues((prevState) => ({
    ...prevState,
    [name]: value
  }));
}
Enter fullscreen mode Exit fullscreen mode

A função handleInputChange pega o name e o value do evento para setar de forma dinâmica os valores no state formValues

Por fim vamos renderizar os botões de avançar ou enviar formulário caso o passo atual seja o último.

{currentStep < steps.length - 1 && (
  <button 
    className="button next" 
    type="button" 
    onClick={handleNextStep}
  >
    Próximo
  </button>
)}

{currentStep === steps.length - 1 && (
  <button className="button submit" type="submit">
    Enviar
  </button>
)}
Enter fullscreen mode Exit fullscreen mode

Com isso nosso formulário está completo, avançando de passo em passo até o submit.

Concluindo

Esta é apenas uma das muitas formas de se criar um formulário multi step em React.
Uma outra abordagem bem usada é recuperar os passos do formulário de uma API, podendo assim criar diferentes passos dependendo do retorno.

Acesse a demo no codesandbox para conferir o código completo e o formulário funcionando.

SurveyJS custom survey software

JavaScript UI Libraries for Surveys and Forms

SurveyJS lets you build a JSON-based form management system that integrates with any backend, giving you full control over your data and no user limits. Includes support for custom question types, skip logic, integrated CCS editor, PDF export, real-time analytics & more.

Learn more

Top comments (2)

Collapse
 
joaopaulo_avila profile image
João Paulo Ávila

Artigo excelente, mas só uma ressalva, acredito que a chamada da função ao clicar o botão é handleNextStep

Collapse
 
nuwandalobo profile image
Felipe Lôbo

Muito obrigado meu caro. Foi bem útil.

SurveyJS custom survey software

JavaScript Form Builder UI Component

Generate dynamic JSON-driven forms directly in your JavaScript app (Angular, React, Vue.js, jQuery) with a fully customizable drag-and-drop form builder. Easily integrate with any backend system and retain full ownership over your data, with no user or form submission limits.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay