React Dynamic multi-step form: A multi-step form breaks a large task into smaller, easier steps. It is used to make data entry more manageable, engaging, and error-free and to conduct surveys online.
Suppose you’re filling out a long form online. But instead of getting all the questions input fields at once, you get a few input fields on one page, then a few more on the next page, and so on.
This makes it easier and helps you focus on one part of the information at a time. It’s like a guided journey through the form, making it easier for you to provide the information needed.
In this tutorial, you learn to create a multi-step form in React with organized, reusable components and a user-friendly interface.
So that Users can input their information across multiple steps review it in the final step, and navigate between steps without any restriction.
Steps to Create Dynamic Multi-step Form in React
Now, We will create a dynamic multi-step form in React with separate components for each step and use HTML, CSS, and Bootstrap 5 for styling.
Key concepts of a multi-step form:
- Dividing a long form into smaller, manageable steps.
- Providing “Next” and “Previous” buttons for guidance.
- Checking data validity at each step to prevent errors.
- Allow users to verify their entries before submission.
- Implementing each step as a separate component.
- Making Responsive for all devices
1. Set Up Basic Configuration
First of all, You must set up the following basic configuration –
2. Create Component Files
myapp |__src/ |__ components/ | |__multi-step-form/ | |__ Step1.js | |__ Step2.js | |__ Step3.js | |__ Step4.js | |__ MultiStepForm.js |__ App.js |__ index.js
3. Create Step1 Component
Create a Step1 component for displaying First Name & Last Name input fields
File Name – Step1.js
import React from 'react'; function Step1({ formData, setFormData }) { return ( <div> <h2>Step 1: First Name & Last Name</h2> <div className="mb-3"> <label htmlFor="firstName" className="form-label"> First Name </label> <input type="text" className="form-control" id="firstName" value={formData.firstName} onChange={(e) => setFormData({ ...formData, firstName: e.target.value }) } /> </div> <div className="mb-3"> <label htmlFor="lastName" className="form-label"> Last Name </label> <input type="text" className="form-control" id="lastName" value={formData.lastName} onChange={(e) => setFormData({ ...formData, lastName: e.target.value }) } /> </div> </div> ); } export default Step1;
4. Create Step2 Component
Create a Step2 component for displaying Date of Birth & Gender
File Name – Step2.js
import React from 'react'; function Step2({ formData, setFormData }) { return ( <div> <h2>Step 2: Date of Birth & Gender</h2> <div className="mb-3"> <label htmlFor="dob" className="form-label"> Date of Birth </label> <input type="date" className="form-control" id="dob" value={formData.dob} onChange={(e) => setFormData({ ...formData, dob: e.target.value }) } /> </div> <div className="mb-3"> <label htmlFor="gender" className="form-label"> Gender </label> <select className="form-select" id="gender" value={formData.gender} onChange={(e) => setFormData({ ...formData, gender: e.target.value }) } > <option value="">Select Gender</option> <option value="male">Male</option> <option value="female">Female</option> <option value="other">Other</option> </select> </div> </div> ); } export default Step2;
5. Create Step3 Component
Create a Step1 component for displaying Email, Password and confirm password.
File Name – Step3.js
import React from 'react'; function Step3({ formData, setFormData }) { return ( <div> <h2>Step 3: Email & Password</h2> <div className="mb-3"> <label htmlFor="email" className="form-label"> Email </label> <input type="email" className="form-control" id="email" value={formData.email} onChange={(e) => setFormData({ ...formData, email: e.target.value }) } /> </div> <div className="mb-3"> <label htmlFor="password" className="form-label"> Password </label> <input type="password" className="form-control" id="password" value={formData.password} onChange={(e) => setFormData({ ...formData, password: e.target.value }) } /> </div> <div className="mb-3"> <label htmlFor="confirmPassword" className="form-label"> Confirm Password </label> <input type="password" className="form-control" id="confirmPassword" value={formData.confirmPassword} onChange={(e) => setFormData({ ...formData, confirmPassword: e.target.value }) } /> </div> </div> ); } export default Step3;
6. Create Step4 Component
Create a Step4 component for reviewing First Name, Last Name, Gender, Date of Birth & Email and the Submit button
File Name – Step4.js
import React from 'react'; function Step4({ formData }) { return ( <div> <h2>Step 4: Preview</h2> <div> <strong>First Name:</strong> {formData.firstName} </div> <div> <strong>Last Name:</strong> {formData.lastName} </div> <div> <strong>Date of Birth:</strong> {formData.dob} </div> <div> <strong>Gender:</strong> {formData.gender} </div> <div> <strong>Email:</strong> {formData.email} </div> </div> ); } export default Step4;
7. Create Multi Step Form Component
Create a multi-step form to use all components Step1, Step2, Step3 & Step4.
File Name – MultiStepForm.js
import React, { useState } from 'react'; import Step1 from './Step1'; import Step2 from './Step2'; import Step3 from './Step3'; import Step4 from './Step4'; function MainForm() { const [formData, setFormData] = useState({ firstName: '', lastName: '', dob: '', gender: '', email: '', password: '', confirmPassword: '', }); const [currentStep, setCurrentStep] = useState(1); const nextStep = () => { setCurrentStep(currentStep + 1); }; const prevStep = () => { setCurrentStep(currentStep - 1); }; const renderStep = () => { switch (currentStep) { case 1: return <Step1 formData={formData} setFormData={setFormData} />; case 2: return <Step2 formData={formData} setFormData={setFormData} />; case 3: return <Step3 formData={formData} setFormData={setFormData} />; case 4: return <Step4 formData={formData} />; default: return null; } }; return ( <div className="container mt-5"> <form> {renderStep()} <div className="mt-3"> {currentStep > 1 && ( <button type="button" className="btn btn-secondary me-2" onClick={prevStep} > Previous </button> )} {currentStep < 4 && ( <button type="button" className="btn btn-primary" onClick={nextStep} > Next </button> )} </div> </form> </div> ); } export default MainForm;
8. Use Multi-Step Form Component
File Name – App.js
import React from 'react'; import MultiStepForm from './components/multi-step-form/MultiStepForm'; function App() { return ( <div className="App"> <MultiStepForm /> </div> ); } export default App;
9. Display Multi-Step Form
To display the multi-step form in a web browser, first, run the following command in your terminal.
npm start
After that, open the following URL in your web browser to see the multi-step form
http://localhost:3000