19
loading...
This website collects cookies to deliver better user experience
npx create-next-app@latest --ts nextjs-formik-demo
nextjs-formik-demo
.cd nextjs-formik-demo
npm run dev
index.tsx
file and create the form.bootstrap
UI package. It'll be very useful to quickly create a form. We'll also install formik
and yup
.npm install bootstrap formik yup
index.tsx
file and let's start modifying it.import { useState } from 'react';
import { useFormik } from 'formik';
import * as yup from 'yup';
import 'bootstrap/dist/css/bootstrap.min.css';
...
...
import type { NextPage } from 'next';
const Home: NextPage = () => {
const [message, setMessage] = useState(''); // This will be used to show a message if the submission is successful
const [submitted, setSubmitted] = useState(false);
const formik = useFormik({
initialValues: {
email: '',
name: '',
message: '',
},
onSubmit: () => {
setMessage('Form submitted');
setSubmitted(true);
},
validationSchema: yup.object({
name: yup.string().trim().required('Name is required'),
email: yup
.string()
.email('Must be a valid email')
.required('Email is required'),
message: yup.string().trim().required('Message is required'),
}),
});
...
useFormik
hooks to create a Formik object. It contains the initial values, the onSubmit
method followed by a validation schema validationSchema
built with Yup
.formik
object....
<div className="vh-100 d-flex flex-column justify-content-center align-items-center">
<div hidden={!submitted} className="alert alert-primary" role="alert">
{message}
</div>
<form className="w-50" onSubmit={formik.handleSubmit}>
{/* Adding the inputs */}
</form>
</div>
...
<div hidden={!submitted} className="alert alert-primary" role="alert">
{message}
</div>
name
field.<form className="w-50" onSubmit={formik.handleSubmit}>
<div className="mb-3">
<label htmlFor="name" className="form-label">
Name
</label>
<input
type="text"
name="name"
className="form-control"
placeholder="John Doe"
value={formik.values.name}
onChange={formik.handleChange}
onBlur={formik.handleBlur}
/>
{formik.errors.name && (
<div className="text-danger">{formik.errors.name}</div>
)}
</div>
...
</form>
email
field.<form className="w-50" onSubmit={formik.handleSubmit}>
...
<div className="mb-3">
<label htmlFor="email" className="form-label">
Email
</label>
<input
type="email"
name="email"
className="form-control"
placeholder="[email protected]"
value={formik.values.email}
onChange={formik.handleChange}
onBlur={formik.handleBlur}
/>
{formik.errors.email && (
<div className="text-danger">{formik.errors.email}</div>
)}
</div>
...
</form>
message
field.<form className="w-50" onSubmit={formik.handleSubmit}>
...
<div className="mb-3">
<label htmlFor="message" className="form-label">
Message
</label>
<textarea
name="message"
className="form-control"
placeholder="Your message ..."
value={formik.values.message}
onChange={formik.handleChange}
onBlur={formik.handleBlur}
/>
{formik.errors.message && (
<div className="text-danger">{formik.errors.message}</div>
)}
</div>
...
</form>
<form className="w-50" onSubmit={formik.handleSubmit}>
...
<button type="submit" className="btn btn-primary">
Send
</button>
</form>
<div className="vh-100 d-flex flex-column justify-content-center align-items-center">
<div hidden={!submitted} className="alert alert-primary" role="alert">
{message}
</div>
<form className="w-50" onSubmit={formik.handleSubmit}>
<div className="mb-3">
<label htmlFor="name" className="form-label">
Name
</label>
<input
type="text"
name="name"
className="form-control"
placeholder="John Doe"
value={formik.values.name}
onChange={formik.handleChange}
onBlur={formik.handleBlur}
/>
{formik.errors.name && (
<div className="text-danger">{formik.errors.name}</div>
)}
</div>
<div className="mb-3">
<label htmlFor="email" className="form-label">
Email
</label>
<input
type="email"
name="email"
className="form-control"
placeholder="[email protected]"
value={formik.values.email}
onChange={formik.handleChange}
onBlur={formik.handleBlur}
/>
{formik.errors.email && (
<div className="text-danger">{formik.errors.email}</div>
)}
</div>
<div className="mb-3">
<label htmlFor="message" className="form-label">
Message
</label>
<textarea
name="message"
className="form-control"
placeholder="Your message ..."
value={formik.values.message}
onChange={formik.handleChange}
onBlur={formik.handleBlur}
/>
{formik.errors.message && (
<div className="text-danger">{formik.errors.message}</div>
)}
</div>
<button type="submit" className="btn btn-primary">
Send
</button>
</form>
</div>
formik.errors
.{formik.errors.name && (
<div className="text-danger">{formik.errors.name}</div>
)}
name
field for example.index.tsx
.import { useState } from 'react';
import { useFormik } from 'formik';
import type { NextPage } from 'next';
import * as yup from 'yup';
import 'bootstrap/dist/css/bootstrap.min.css';
const Home: NextPage = () => {
const [message, setMessage] = useState(''); // This will be used to show a message if the submission is successful
const [submitted, setSubmitted] = useState(false);
const formik = useFormik({
initialValues: {
email: '',
name: '',
message: '',
},
onSubmit: () => {
setMessage('Form submitted');
setSubmitted(true);
},
validationSchema: yup.object({
name: yup.string().trim().required('Name is required'),
email: yup
.string()
.email('Must be a valid email')
.required('Email is required'),
message: yup.string().trim().required('Message is required'),
}),
});
return (
<div className="vh-100 d-flex flex-column justify-content-center align-items-center">
<div hidden={!submitted} className="alert alert-primary" role="alert">
{message}
</div>
<form className="w-50" onSubmit={formik.handleSubmit}>
<div className="mb-3">
<label htmlFor="name" className="form-label">
Name
</label>
<input
type="text"
name="name"
className="form-control"
placeholder="John Doe"
value={formik.values.name}
onChange={formik.handleChange}
onBlur={formik.handleBlur}
/>
{formik.errors.name && (
<div className="text-danger">{formik.errors.name}</div>
)}
</div>
<div className="mb-3">
<label htmlFor="email" className="form-label">
Email
</label>
<input
type="email"
name="email"
className="form-control"
placeholder="[email protected]"
value={formik.values.email}
onChange={formik.handleChange}
onBlur={formik.handleBlur}
/>
{formik.errors.email && (
<div className="text-danger">{formik.errors.email}</div>
)}
</div>
<div className="mb-3">
<label htmlFor="message" className="form-label">
Message
</label>
<textarea
name="message"
className="form-control"
placeholder="Your message ..."
value={formik.values.message}
onChange={formik.handleChange}
onBlur={formik.handleBlur}
/>
{formik.errors.message && (
<div className="text-danger">{formik.errors.message}</div>
)}
</div>
<button type="submit" className="btn btn-primary">
Send
</button>
</form>
</div>
);
};
export default Home;
Formik
to a Next project in Typescript with Boostrap and Yup.