How To Implement NextJS Form Validation With Formik And Zod ?
Last Updated :
16 May, 2024
Form validation is a critical aspect of web development to ensure that user input meets specific criteria before submitting data to the server. Implementing form validation in Next.js can be simplified using Formik, a form library for React, and Zod, a schema validation library. Together, they provide a robust solution for managing form state and validating input data in Next.js applications.
Prerequisites:
Approach to Implement NextJS Form Validation with Formik and Zod
- Define the layout and structure of the login form using React components and Formik library.
- Specify validation rules for form fields using Zod schema. This includes requirements for the name, email, and message fields.
- Display form fields and error messages dynamically.
- Connect validation schema with Formik.
- When the button is clicked, Formik invokes the
onSubmit
function, triggering the defined actions such as displaying an alert.
Step 1: Create a NextJS application
npx create-next-app <-ProjectName->
Step 2: Navigate to the Project directory
cd <-ProjectName->
Step 3: Install necessary dependencies and bootstrap for CSS styling.
npm install formik zod zod-formik-adapter bootstrap
Project Structure:
Project StructureThe Updated dependencies in your package.json file is look like:
"dependencies": {
"bootstrap": "^5.3.3",
"formik": "^2.4.6",
"next": "14.2.3",
"react": "^18",
"react-dom": "^18",
"zod": "^3.23.8",
"zod-formik-adapter": "^1.3.0"
},
Step 4: Create a folder as components and make a components as LoginForm.tsx
JavaScript
// src/app/components/LoginForm.tsx
import React from "react";
import { TypeOf, object, string } from "zod";
import { Formik, Form, Field } from "formik";
import { toFormikValidationSchema } from "zod-formik-adapter";
type ContactFormInputs = TypeOf<typeof contactFormSchema>
const contactFormSchema = object({
name: string({
required_error: "Please enter your name",
}),
email: string().email("Please enter a valid email"),
message: string().min(50).max(1000),
});
const LoginForm = () => {
return (
<>
<Formik<ContactFormInputs>
initialValues={{
name: "",
email: "",
message: "",
}}
onSubmit={(values) => {
alert("Form is submitted")
console.log("Form is submitted", values);
}}
validationSchema={toFormikValidationSchema(contactFormSchema)}
>{
(FormikState) => {
const errors = FormikState.errors;
return (
<div className="card shadow">
<Form className="card-body">
<div className="card-title">Contact Us</div>
<div className="d-flex justify-content-between gap-2">
<div className="form-group w-100">
<label className="form-label">
<span className="label-text">Your name</span>
</label>
<Field
type="text"
name="name"
placeholder="e.g. John Doe"
className="form-control"
/>{!!errors.name && (
<div className="form-text text-danger">
{errors.name}
</div>
)}
</div>
<div className="form-group w-100">
<label className="form-label">
<span className="label-text">Your email</span>
</label>
<Field
type="text"
name="email"
placeholder="e.g [email protected]"
className="form-control"
/>
{!!errors.email && (
<div className="form-text text-danger">
{errors.email}
</div>
)}
</div>
</div>
<div className="form-group">
<label className="form-label">
<span className="label-text">Your message</span>
</label>
<Field
as="textarea"
type="text"
name="message"
className="form-control h-24"
placeholder="Message"
/>
{!!errors.message && (
<div className="form-text text-danger">
{errors.message}
</div>
)}
</div>
<div className="card-actions justify-content-end">
<button className="btn btn-primary" type="submit">
Submit
</button>
</div>
</Form>
</div>
)
}
}
</Formik>
</>
);
};
export default LoginForm;
JavaScript
// page.js
'use client';
import "bootstrap/dist/css/bootstrap.min.css";
import LoginForm from './components/LoginForm.tsx';
import React from 'react';
export default function Home() {
return (
<div className="container">
<div className="row justify-content-center
align-items-center min-vh-100">
<div className="col-md-6">
<h1 className="text-center mb-4">
Welcome to Zod + Formik Tutorial
</h1>
<LoginForm />
</div>
</div>
</div>
);
}
Start your application using the following command:
npm run dev
Output:
Validation using formik and zod
Similar Reads
How to Add Form Validation In Next.js ? Forms play a crucial role in modern web applications by ensuring the accuracy and validity of data. NeÂxt.js, a versatile framework for building ReÂact applications, offers form validation that helps verify useÂr input against predefined criteÂria, provides immediate feedback, and enhances data qual
3 min read
How to implement validation in Express JS? Validation is an important process in Express JS which ensures that the data received by the server fulfills the specific requirements or rules before it is processed further. This process helps in maintaining the integrity, security, and reliability of web applications. ExpressJS provides various t
3 min read
ReactJS Form Validation using Formik and Yup ReactJS Form Validation using Formik and Yup packages is one good approach for form validation. we can validate forms using controlled components. But it may be time-consuming and the length of the code may increase if we need forms at many places on our website. Formik is designed to manage forms w
3 min read
How to perform custom validation in Angular forms? Angular's built-in form controls provide a set of predefined validators for common validation such as required fields, email format, and minimum/maximum values. However, there may be cases where you need to implement custom validation logic specific to your application's requirements. Angular offers
4 min read
How to perform form validation in React? Form validation in React involves ensuring that the data entered into a form meets certain criteria before submission. In this, we will see the form validation in React.Pre-requisitesNodeJS and NPMReactJSReact useState hookHTML, CSS, and JavaScriptSteps to Create React Application And Installing Mod
4 min read