Simplify your Form Validation in React with Yup
When building web applications, form validation is key to ensuring data integrity. If you're looking for a simple yet powerful way to validate forms in React, Yup is your best friend! This blog will walk you through the steps to set up Yup and create a polished form with validation.
What You’ll Learn
By the end of this blog, you'll know how to:
- Set up Yup for validation in React.
- Build a form with validation rules.
- Style your form using external CSS.
Prerequisites
Before diving in, make sure you have:
- Basic knowledge of React.
- Node.js installed on your computer.
Step 1: Setting Up Yup
First, install Yup in your React project. Run the following command in your terminal:
npm install yup
Step 2: Creating the Form
Here's a simple form with fields for a name and email. We'll use React's useState to manage input values and errors.
import React, { useState } from 'react'; function MyForm() { const [formData, setFormData] = useState({ name: '', email: '' }); const [errors, setErrors] = useState({}); const handleChange = (e) => { setFormData({ ...formData, [e.target.name]: e.target.value }); }; const handleSubmit = (e) => { e.preventDefault(); // Validation will go here }; return ( <form onSubmit={handleSubmit}> <div> <label>Name:</label> <input type="text" name="name" value={formData.name} onChange={handleChange} /> </div> <div> <label>Email:</label> <input type="email" name="email" value={formData.email} onChange={handleChange} /> </div> <button type="submit">Submit</button> </form> ); } export default MyForm;
Step 3:
Now it is time to integrate Yup. I'll be creating a validation schema and then check the form data once submitted.
import * as Yup from "yup" const validationSchema = Yup.object({ name: Yup.string().required('Name is required!') email: Yup.string().email('Your email is invalid').required('email is required') })
I'll use this schema in the handleSubmit
function to validate the form
const handleSubmit = (e) => { e.preventDefault(); try { await validationSchema.validate(formData, { abortEarly: false }); setErrors({}); alert('Form is valid!'); } catch (err) { const newErrors = {}; err.inner.forEach((error) => { newErrors[error.path] = error.message; }); setErrors(newErrors); } };
Step 4: Styling the form
To make the form look good, create an external CSS file (MyForm.css
) and add these styles:
.form-container { max-width: 400px; margin: 50px auto; padding: 20px; background: #f9f9f9; border-radius: 8px; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); } .label { font-weight: bold; } .input { width: 100%; padding: 10px; margin: 5px 0; border-radius: 4px; } .error { color: red; font-size: 12px; } .button { background: #4caf50; color: white; padding: 10px; border: none; border-radius: 4px; cursor: pointer; } .button:hover { background: #45a049; }
Import the CSS file into your component:
import './MyForm.css';
Full Code:
import React, { useState } from 'react'; import * as Yup from 'yup'; import './MyForm.css'; function MyForm() { const [formData, setFormData] = useState({ name: '', email: '' }); const [errors, setErrors] = useState({}); const validationSchema = Yup.object({ name: Yup.string().required('Name is required!'), email: Yup.string().email('Invalid email!').required('Email is required!'), }); const handleChange = (e) => { setFormData({ ...formData, [e.target.name]: e.target.value }); }; const handleSubmit = async (e) => { e.preventDefault(); try { await validationSchema.validate(formData, { abortEarly: false }); setErrors({}); alert('Form is valid!'); } catch (err) { const newErrors = {}; err.inner.forEach((error) => { newErrors[error.path] = error.message; }); setErrors(newErrors); } }; return ( <div className="form-container"> <h1>Simple Form</h1> <form onSubmit={handleSubmit}> <div> <label className="label">Name:</label> <input type="text" name="name" value={formData.name} onChange={handleChange} className="input" /> {errors.name && <div className="error">{errors.name}</div>} </div> <div> <label className="label">Email:</label> <input type="email" name="email" value={formData.email} onChange={handleChange} className="input" /> {errors.email && <div className="error">{errors.email}</div>} </div> <button type="submit" className="button">Submit</button> </form> </div> ); } export default MyForm;
Conclusion
Yup is a powerful tool for form validation, even without Formik. With just a few lines of code, you can add robust validation to your React apps.
Top comments (0)