Back to articles

Level Up Your React Forms: Mastering React Hook Form in 2024

AuthorMajd Muhtaseb10/03/20257 minutes

Introduction

Handling forms in React can be tedious. React Hook Form provides a performant and flexible solution by leveraging uncontrolled components and minimizing re-renders. This article dives into the core concepts and best practices for using React Hook Form in your projects.

Why React Hook Form?

  • Performance: Reduces re-renders by using uncontrolled components.
  • Developer Experience: Simple API and intuitive hook-based approach.
  • Validation: Built-in support for various validation libraries like Yup and Zod.
  • TypeScript: Excellent TypeScript support for type safety.

Getting Started

Install React Hook Form:

npm install react-hook-form

Basic Example

Here's a simple example of a form with React Hook Form:

import React from 'react';
import { useForm } from 'react-hook-form';

function MyForm() {
  const { register, handleSubmit, formState: { errors } } = useForm();

  const onSubmit = (data) => {
    console.log(data);
  };

  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      <label htmlFor="firstName">First Name:</label>
      <input type="text" id="firstName" {...register("firstName", { required: "First name is required" })} />
      {errors.firstName && <p>{errors.firstName.message}</p>}

      <label htmlFor="lastName">Last Name:</label>
      <input type="text" id="lastName" {...register("lastName")} />

      <button type="submit">Submit</button>
    </form>
  );
}

export default MyForm;

Explanation:

  • useForm() returns a set of functions, including register, handleSubmit, and the formState.
  • register is used to register your input fields with React Hook Form. You can also specify validation rules here.
  • handleSubmit takes your submit function and handles form validation before calling it.
  • errors contains any validation errors.

Validation

React Hook Form can be easily integrated with validation libraries. Here's an example using Yup:

npm install yup @hookform/resolvers
import React from 'react';
import { useForm } from 'react-hook-form';
import { yupResolver } from '@hookform/resolvers/yup';
import * as yup from "yup";

const schema = yup.object({
  firstName: yup.string().required("First Name is required"),
  lastName: yup.string().required("Last Name is required"),
  email: yup.string().email("Invalid email format").required("Email is required"),
}).required();


function YupForm() {
  const { register, handleSubmit, formState: { errors } } = useForm({
    resolver: yupResolver(schema)
  });

  const onSubmit = (data) => {
    console.log(data);
  };

  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      <label htmlFor="firstName">First Name:</label>
      <input type="text" id="firstName" {...register("firstName")} />
      {errors.firstName && <p>{errors.firstName.message}</p>}

      <label htmlFor="lastName">Last Name:</label>
      <input type="text" id="lastName" {...register("lastName")} />
      {errors.lastName && <p>{errors.lastName.message}</p>}

      <label htmlFor="email">Email:</label>
      <input type="email" id="email" {...register("email")} />
      {errors.email && <p>{errors.email.message}</p>}

      <button type="submit">Submit</button>
    </form>
  );
}

export default YupForm;

Common Pitfalls and Best Practices

  • Uncontrolled Components: Embrace uncontrolled components for better performance.
  • defaultValue vs. defaultValues: Use defaultValues when initializing the form with existing data.
  • Watch out for re-renders: Use useWatch or Controller component carefully to avoid unnecessary re-renders.
  • Leverage TypeScript: Define your form schema types to enhance type safety.

Conclusion

React Hook Form is a powerful tool for building performant and user-friendly forms in React. By understanding its core concepts and best practices, you can streamline your form development process and create a better user experience.