Yup is a validation library used to check form rules like:
- required fields
- email format
- minimum length
- password rules
Instead of writing manual if condition, Yup does it in a clean way.
npm install yupCreate Validation Schema:
import * as yup from "yup";
const signupSchema = yup.object({
name: yup
.string()
.required("Name is required")
.min(2, "Name must be at least 2 characters"),
email: yup
.string()
.required("Email is required")
.email("Invalid email address"),
phone: yup
.string()
.required("Phone number is required")
.matches(/^[0-9]{10}$/, "Phone number must be 10 digits"),
password: yup
.string()
.required("Password is required")
.min(8, "Password must be at least 8 characters")
});Validate before API Call:
const handleSubmit = async (e) => {
e.preventDefault();
setSuccessMessage("");
setErrorMessage("");
try {
await signupSchema.validate(
{ name, email, phone, password },
{ abortEarly: true }
);
const response = await signupUser({
name,
email,
phone,
password
});
setSuccessMessage(response.message || "Signup successful");
} catch (error) {
setErrorMessage(error.message);
}
};Example:
import { useState } from "react";
import * as Yup from "yup";
function App() {
const [name, setName] = useState("");
const [email, setEmail] = useState("");
const [error, setError] = useState("");
// 1. Yup validation schema
const schema = Yup.object({
name: Yup.string().required("Name is required"),
email: Yup.string()
.email("Invalid email format")
.required("Email is required")
});
const handleSubmit = async (e) => {
e.preventDefault();
try {
// 2. validate data using Yup
await schema.validate(
{ name, email },
{ abortEarly: false }
);
setError("");
alert("Form Submitted");
} catch (err) {
// 3. show first error
setError(err.errors[0]);
}
};
return (
<div style={{ textAlign: "center" }}>
<h2>Yup Validation Example</h2>
<form onSubmit={handleSubmit}>
<input
type="text"
placeholder="Enter Name"
value={name}
onChange={(e) => setName(e.target.value)}
/>
<br /><br />
<input
type="email"
placeholder="Enter Email"
value={email}
onChange={(e) => setEmail(e.target.value)}
/>
<br /><br />
<button type="submit">Submit</button>
</form>
<p style={{ color: "red" }}>{error}</p>
</div>
);
}
export default App;