Formik
Yup
React
Form Validation
Web Development
JavaScript
Frontend Development

Create a form with Formik and Yup

Deepak Tewatia
August 26, 2025
5 min read
Create a form with Formik and Yup

Creating a book entry form with validation using Formik in a React application is a common task when building a library management system or any application that involves data input. Formik is a powerful library for managing forms in React, and it simplifies the process of handling form state and validation. In this step-by-step guide, we’ll create an AddBook component with Formik and demonstrate how to add form validation. Let’s get started!

Setup React Project

Before you begin, make sure you have a React project set up. You can create a new React project using tools like Create React App or set up your project manually.

Install Formik and Yup

Before you start, make sure you have Formik and Yup installed in your project. You can install them using npm or yarn:

npm install formik yup
         OR
  yarn add formik yup

Create the AddBook.js Component

Create a new file named AddBook.js and import the necessary modules and components:

import React from "react";
  import Button from "react-bootstrap/Button";
  import Col from "react-bootstrap/Col";
  import Form from "react-bootstrap/Form";
  import Row from "react-bootstrap/Row";
  import * as formik from "formik";
  import * as yup from "yup";
  import { useTheme } from "../ThemeContext.js";
  
  const AddBook = () => {
    const { theme } = useTheme();
    const { Formik } = formik;
  
    const schema = yup.object().shape({
      bookTitle: yup.string().required(),
      bookName: yup.string().required(),
      authorName: yup.string().required(),
      quantity: yup.string().required(),
      isbn: yup.string().required(),
      genre: yup.string().required(),
      publicationYear: yup.string().required(),
      bookDescription: yup.string().required(),
      bookLocation: yup.mixed().required(),
    });
  
    const onAddBook = (values) => {
      var bookObj = [
        {
          id: 1,
          title: values.bookTitle,
          author: values.authorName,
          isbn: values.isbn,
          genre: values.genre,
          description: values.description,
          publication_year: values.publicationYear,
          language: "English",
          cover_image: "/Images/book-Cover.jpg",
          total_copies: values.quantity,
          available_copies: values.quantity,
          location: values.location,
          is_borrowed: false,
        },
      ];
      localStorage.setItem("addedBooks", JSON.stringify(bookObj));
    };
  
    return (
      <>
        <div className={`App ${theme}`}>
          <h1>Add New Book</h1>
          <Formik
            validationSchema={schema}
            // onSubmit={onAddBook}
            initialValues={{
              bookTitle: "",
              authorName: "",
              quantity: "",
              isbn: "",
              genre: "",
              publicationYear: "",
              bookDescription: "",
              bookLocation: "",
            }}
          >
            {({ handleSubmit, handleChange, values, touched, errors }) => (
              <Form noValidate onSubmit={handleSubmit} className="add_book">
                <Row className="mb-3">
                  {/* <Form.Group
                    as={Col}
                    md="3"
                    controlId="validationFormik104"
                    className="position-relative"
                  >
                    <Form.Label>Book Title</Form.Label>
                    <Form.Control
                      type="text"
                      placeholder="Book Title"
                      name="bookTitle"
                      value={values.bookTitle}
                      onChange={handleChange}
                      isInvalid={!!errors.bookTitle}
                    />
                    <Form.Control.Feedback type="invalid" tooltip>
                      {errors.genre}
                    </Form.Control.Feedback>
                  </Form.Group> */}
  
                  <Form.Group
                    as={Col}
                    md="5"
                    controlId="validationFormik101"
                    className="position-relative"
                  >
                    <Form.Label>Book Title</Form.Label>
                    <Form.Control
                      type="text"
                      name="bookTitle"
                      placeholder="Book Title"
                      value={values.bookTitle}
                      onChange={handleChange}
                      isInvalid={touched.bookTitle && !!errors.bookTitle}
                    />
                    <Form.Control.Feedback type="invalid" tooltip>
                      {errors.bookTitle}
                    </Form.Control.Feedback>
                  </Form.Group>
                  <Form.Group
                    as={Col}
                    md="4"
                    controlId="validationFormik102"
                    className="position-relative"
                  >
                    <Form.Label>Author Name</Form.Label>
                    <Form.Control
                      type="text"
                      name="authorName"
                      placeholder="Author Name"
                      value={values.authorName}
                      onChange={handleChange}
                      isInvalid={touched.authorName && !!errors.authorName}
                    />
                    <Form.Control.Feedback type="invalid" tooltip>
                      {errors.authorName}
                    </Form.Control.Feedback>
                  </Form.Group>
                  <Form.Group
                    as={Col}
                    md="2"
                    controlId="validationFormik103"
                    className="position-relative"
                  >
                    <Form.Label>Quantity</Form.Label>
                    <Form.Control
                      type="number"
                      placeholder="Number of Books"
                      name="quantity"
                      value={values.quantity}
                      onChange={handleChange}
                      isInvalid={touched.quantity && !!errors.quantity}
                    />
                    <Form.Control.Feedback type="invalid" tooltip>
                      {errors.quantity}
                    </Form.Control.Feedback>
                  </Form.Group>
                </Row>
                <Row className="mb-3">
                  <Form.Group
                    as={Col}
                    md="4"
                    controlId="validationFormik102"
                    className="position-relative"
                  >
                    <Form.Label>isbn</Form.Label>
                    <Form.Control
                      type="text"
                      name="isbn"
                      placeholder="ISBN"
                      value={values.isbn}
                      onChange={handleChange}
                      isInvalid={touched.isbn && !!errors.isbn}
                    />
                    <Form.Control.Feedback type="invalid" tooltip>
                      {errors.isbn}
                    </Form.Control.Feedback>
                  </Form.Group>
                  <Form.Group
                    as={Col}
                    md="3"
                    controlId="validationFormik104"
                    className="position-relative"
                  >
                    <Form.Label>Genre</Form.Label>
                    <Form.Control
                      type="text"
                      placeholder="Genre"
                      name="genre"
                      value={values.genre}
                      onChange={handleChange}
                      isInvalid={!!errors.genre}
                    />
                    <Form.Control.Feedback type="invalid" tooltip>
                      {errors.genre}
                    </Form.Control.Feedback>
                  </Form.Group>
                  <Form.Group
                    as={Col}
                    md="4"
                    controlId="validationFormik105"
                    className="position-relative"
                  >
                    <Form.Label>Publication Year</Form.Label>
                    <Form.Control
                      type="text"
                      placeholder="Publication Year"
                      name="publicationYear"
                      value={values.publicationYear}
                      onChange={handleChange}
                      isInvalid={!!errors.publicationYear}
                    />
                    <Form.Control.Feedback type="invalid" tooltip>
                      {errors.publicationYear}
                    </Form.Control.Feedback>
                  </Form.Group>
                </Row>
                <Row className="mb-3">
                  <Form.Group
                    as={Col}
                    md="7"
                    controlId="validationFormik105"
                    className="position-relative"
                  >
                    <Form.Label>Book Description</Form.Label>
                    <Form.Control
                      as="textarea"
                      rows={2}
                      name="bookDescription"
                      value={values.bookDescription}
                      onChange={handleChange}
                      isInvalid={!!errors.bookDescription}
                    />
                    <Form.Control.Feedback type="invalid" tooltip>
                      {errors.bookDescription}
                    </Form.Control.Feedback>
                  </Form.Group>
                  <Form.Group
                    as={Col}
                    md="4"
                    controlId="validationFormik103"
                    className="position-relative"
                  >
                    <Form.Label>Book Location</Form.Label>
                    <Form.Control
                      type="text"
                      placeholder="Book Location"
                      name="bookLocation"
                      value={values.bookLocation}
                      onChange={handleChange}
                      isInvalid={touched.bookLocation && !!errors.bookLocation}
                    />
                    <Form.Control.Feedback type="invalid" tooltip>
                      {errors.bookLocation}
                    </Form.Control.Feedback>
                  </Form.Group>
                </Row>
  
                <Button type="submit" onClick={() => onAddBook(values)}>
                  Add Book
                </Button>
              </Form>
            )}
          </Formik>
        </div>
      </>
    );
  };
  
  export default AddBook;
Form with formik and yup

Form with formik and yup

In this code:

  • We import the necessary components and libraries from Formik and Yup.
  • We define the AddBook functional component, which contains the book entry form.
  • We set up the initial form values, validation schema, and a function to handle the form submission.
  • Inside the Formik component, we render form fields using the Field component and display validation errors using the ErrorMessage component.
  • We use the validationSchema to specify validation rules for each form field.

After submitting the form, as of now the data will be stored in the localStorage and it will look something like this:

data stored in localstorage

data stored in localstorage

Display the AddBook Component

In your application, import and display the AddBook component where you want to provide the book entry form.

import React from 'react';
  import AddBook from './AddBook'; // Import the AddBook component
  
  function App() {
    return (
      <div className="App">
        <AddBook /> {/* Display the AddBook component */}
      </div>
    );
  }
  
  export default App;

Style the Form

You can apply CSS styles to your form to make it visually appealing and user-friendly. You can use your preferred CSS framework or write custom styles.

Test and Validate

Run your React application and navigate to the page where the AddBook component is displayed. You should see the book entry form with validation. Try submitting the form with valid and invalid data to ensure that validation works as expected. Ensuring the validations whether it works as expected, results are as shown below:

Validations with formik and yup

Validations with formik and yup

Conclusion

You’ve successfully created an AddBook component with Formik and added form validation. This component can serve as a starting point for adding books to your library management system. You can further extend it by adding functionality to submit book data to a backend server or store it in your application’s state.