Simplify Form Handling in React with React Hook Form

Abdurashid
4 min readMay 14, 2024

--

screenshot from react hook form’s official website

React Hook Form is a game-changer when it comes to handling forms in React applications. It simplifies form state management, improves performance, provides declarative validation, enables flexible integration, and reduces boilerplate code. By leveraging React Hook Form, you can create reusable form components, streamline your development process, and deliver a better user experience.
In the following points I wil explain reasons why you should use it:
1. Simplified State Management: React Hook Form takes care of managing the form state for you. It automatically tracks the values of form fields and updates the state accordingly. This eliminates the need for manual state management, reducing the complexity of your code and minimizing the risk of bugs. And its DevTools makes your DX so much easy and smooth.

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

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

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

return (
<form onSubmit={handleSubmit(onSubmit)}>
<input type="text" {...register("name")} />
<input type="email" {...register("email")} />
<button type="submit">Submit</button>
</form>
);
}

In this example, React Hook Form automatically manages the form state. By using the register function, the form fields are registered with the form, and their values are tracked automatically. The handleSubmit function handles the form submission and provides the form data to the onSubmit callback.

2. Efficient Re-renders: With React Hook Form, only the fields that have changed are re-rendered. This optimized rendering approach improves performance by avoiding unnecessary re-renders of the entire form. As a result, your application becomes more responsive and efficient.

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

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

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

return (
<form onSubmit={handleSubmit(onSubmit)}>
<input type="text" {...register("name")} />
<input type="email" {...register("email")} />
<ExpensiveComponent />
<button type="submit">Submit</button>
</form>
);
}

In this example, when the form fields are updated, only those specific fields are re-rendered. The ExpensiveComponent, which may have costly rendering logic, remains untouched and is not unnecessarily re-rendered. React Hook Form optimizes the rendering process, improving the overall performance of the form.

3. Declarative Validation: React Hook Form provides a declarative way to define form validation rules. You can specify validation requirements for each field using a simple and intuitive syntax. This makes it easy to enforce validation rules and provide meaningful error messages to users.

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)}>
<input
type="text"
{...register("name",{ required: 'Name is required' })}
/>
{errors.name && <span>{errors.name.message}</span>}
{/* as you can see it is very handy with handling errors as well*/}
<input
type="email"
{...register("email",{
required: 'Email is required',
pattern: {
value: /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}$/i,
message: 'Invalid email address',
},
})}
/>
{errors.email && <span>{errors.email.message}</span>}

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

In this example, validation rules are defined declaratively using the register function. The required and pattern options are used to specify validation requirements for the name and email fields. If a validation rule is violated, the corresponding error message is displayed below the field.

4. Flexible Integration: React Hook Form seamlessly integrates with your existing React components. You can create reusable form components that encapsulate the form logic and validation rules. These components can be easily composed and reused across your application, promoting code reusability and maintainability.

import { useForm, FormProvider } from 'react-hook-form';
import InputField from './InputField';

function MyForm() {
const methods = useForm();

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

return (
<FormProvider {...methods}>
<form onSubmit={methods.handleSubmit(onSubmit)}>
<InputField name="name" label="Name" />
<InputField name="email" label="Email" type="email" />
<button type="submit">Submit</button>
</form>
</FormProvider>
);
}

function InputField({ name, label, type = 'text' }) {
const { register } = useForm();

return (
<div>
<label>{label}</label>
<input type={type} {...register(name)} />
</div>
);
}

In this example, the InputField component is a reusable form component that encapsulates the input field logic. It uses the useForm hook to access the form context and register the field with the form. The MyForm component uses the FormProvider to provide the form context to its child components, allowing them to access the form state and methods.

5. Reduced Boilerplate Code: By using React Hook Form, you can significantly reduce the amount of boilerplate code required to handle forms. The library provides a clean and concise API that abstracts away the complexities of form handling. This leads to more readable and maintainable code, allowing you to focus on the core functionality of your application.

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

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

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

return (
<form onSubmit={handleSubmit(onSubmit)}>
<input type="text" {...register("name")} />
<input type="email" {...register("email")} />
<button type="submit">Submit</button>
</form>
);
}

In this example, React Hook Form reduces the amount of boilerplate code required to handle form state and submission. With just a few lines of code, the form is set up with state management, submission handling, and field registration. This concise and expressive code improves readability and maintainability.

As I mentioned in the beginning of this article, react hook form felt like a game changer in my personal experience if the project has pretty much form handlings and you want a decent developer experience getting your job done.

Since react is really handy with reusable components, I am gonna explain how I leveraged component reusablility with react hook form, which can be a good example for you as well in this article.

--

--