- Published on
How to do Password Validation with Yup and Formik ?
- Authors
- Name
- Ripal & Zalak
How to do Password Validation with Yup and Formik ?
Validation Schema
Create a validation schema using Yup. This example enforces strong password rules:
import * as Yup from 'yup'
const validationSchema = Yup.object({
password: Yup.string()
.required('Password is required')
.min(8, 'Password must be at least 8 characters')
.matches(/[a-z]/, 'Password must contain at least one lowercase letter')
.matches(/[A-Z]/, 'Password must contain at least one uppercase letter')
.matches(/[0-9]/, 'Password must contain at least one number')
.matches(/[!@#$%^&*(),.?":{}|<>]/, 'Password must contain at least one special character'),
confirmPassword: Yup.string()
.oneOf([Yup.ref('password'), null], 'Passwords must match')
.required('Confirm Password is required'),
})
Formik Form Component
Here’s how you can integrate the validation schema with Formik:
import React from 'react'
import { Formik, Form, Field, ErrorMessage } from 'formik'
import * as Yup from 'yup'
const validationSchema = Yup.object({
password: Yup.string()
.required('Password is required')
.min(8, 'Password must be at least 8 characters')
.matches(/[a-z]/, 'Password must contain at least one lowercase letter')
.matches(/[A-Z]/, 'Password must contain at least one uppercase letter')
.matches(/[0-9]/, 'Password must contain at least one number')
.matches(/[!@#$%^&*(),.?":{}|<>]/, 'Password must contain at least one special character'),
confirmPassword: Yup.string()
.oneOf([Yup.ref('password'), null], 'Passwords must match')
.required('Confirm Password is required'),
})
const PasswordForm = () => {
const initialValues = {
password: '',
confirmPassword: '',
}
const handleSubmit = (values) => {
console.log('Form Submitted:', values)
}
return (
<Formik
initialValues={initialValues}
validationSchema={validationSchema}
onSubmit={handleSubmit}
>
{({ isSubmitting }) => (
<Form>
<div>
<label htmlFor="password">Password</label>
<Field type="password" name="password" />
<ErrorMessage name="password" component="div" />
</div>
<div>
<label htmlFor="confirmPassword">Confirm Password</label>
<Field type="password" name="confirmPassword" />
<ErrorMessage name="confirmPassword" component="div" />
</div>
<button type="submit" disabled={isSubmitting}>
Submit
</button>
</Form>
)}
</Formik>
)
}
export default PasswordForm
Custom Error Handling
If you need to display errors in a more structured way, you can customize the ErrorMessage
component or use formik.touched
and formik.errors
to manually handle error states.