Why is React Hook Form better than other forms?
Introduction
The react hook forms vs formik comes with support for easy form validation that allows you to build performant, flexible, and extensible forms. The library requires no other dependencies, so it is lightweight. it uses ref instead of the component state which speeds up performance.
It has the following features:
- Optimized for performance, UX, and DX.
- Supports native form validation.
- It integrates out of the box with UI libraries.
- It’s small and requires no dependencies.
- Based on the HTML standard for form validation.
- You can use Yup, Zod, Superstruct, Joi, Vest, class-validator, IO-TS, NOPE, or a custom validation.
Analyzing the performance of React Hook Form:
Creating this library was primarily motivated by performance. In this way, you can reduce the amount of re-rendering that occurs when the root values of a form or application change due to user input or other changes. Due to the reduced overhead, components mount faster than controlled components. You can refer to the link below for a quick comparison test. Click here.
React Hook Form is more efficient than other libraries because it simplifies the handling of form events. Below are a few other benefits.
Re-render isolated components:
With react hook forms vs formik, you can isolate a component and avoid having other components re-render. Using this feature, other child components won’t be rendered in an unwanted manner which will improve performance. However, libraries like Formik and Redux-Form also re-render the other child components along with the form component.
Reducing rendering:
Besides isolating the component, it restricts its form rendering to events like onChange,onBlur, etc.
Faster mounting process:
It is approximately 13% quicker than Formik and 25% faster than Redux-Form mount. Other libraries are slower at inserting the DOM elements into the form’s tree, so this library will render faster than other libraries.
Enter Subscription Changes:
It allows you to subscribe to each input component without going through the there-rendering of each component inside the form component.
Typescript Compatibility:
It is constructed with TypeScript and can define a FormData type to support form values.
Less Code to Maintain:
There are fewer bugs when there is less code! The useForm() hook is provided by the React Hook Form and consists of the handle submit, register, and error methods and props. They’d take care of the submitted events, register the input via refs, and display any mistakes. However, you must create your custom handlers for events and validations in the other two libraries.
React hook Forms vs Formik vs Redux Form?
The basic concept of all three libs is to make the building of forms as easy as possible, but there are some important differences between the three. Designed for uncontrolled inputs, react-hook-form strives to provide you with the best performance and smallest amount of re-rendering. Furthermore, react-hook-form is built with React Hooks and utilized as a hook, which means you do not have to import any components. These are some of the detailed differences:
React Hook Form | Formik | Redux Form | |
Component | uncontrolled & controlled | controlled | controlled |
Rendering | minimum re-render | re-render according to local state changes which means as you type in the input. | re-render according to state management lib (Redux) changes which means as you type in the input. |
API | Hooks | Component (RenderProps, Form, Field) + Hooks | Component (RenderProps, Form, Field) |
Package size | Small [email protected] 8KB | Medium [email protected] 15KB | Large [email protected] 26.4KB |
Validation | Built-in, Yup, Zod, Joi, Superstruct and build your own. | Build yourself or Yup | Build yourself or Plugins |
Learning curve | Low to Medium | Medium | Medium |
No. of mounts | Only requires mounting the form | It mounts the form, some additional components, and uses a special component for fields | It mounts the form, some additional components, and uses a special component for fields |
No. of committing changes | 1 | 6 | 17 |
Total mounting times | 1800ms | 2070ms | 2380ms |
Installation:-
- npm install react-hook-form
Basic Form Creation Using react-hook-form:-
A useForm hook is provided by the react-hook-form library, which allows us to work with forms.
- You can import the useForm hook like this:
- import { useForm } from ‘react-hook-form’;
- The useForm hook is used as follows:
- const { register, handleSubmit, errors } = useForm();
Here,- Register fields:-
- Using the, one of the key concepts is registering your uncontrolled component in the hook. This will make its value available for form validation and submission.
- Handle Submit:-
- When the form is submitted, we can call handle to submit.
- Errors:-
- If any validation errors occurred, they will be in the errors.
- Register fields:-
- const { register, handleSubmit, errors } = useForm();
- Apply validation:
- It aligns with the existing HTML standard for form validation, making form validation easy.
- Here is a list of the validation rules that are supported:
- required
- min
- max
- minLength
- maxLength
- pattern
- validate
- Code:
import React from "react"; import ReactDOM from "react-dom"; import { useForm } from "react-hook-form"; import "./styles.css"; function App() { const { register, handleSubmit, watch, formState: { errors } } = useForm(); const onSubmit = (data) => { alert(JSON.stringify(data)); }; // your form submit function which will invoke after successful validation console.log(watch("example")); // you can watch individual input by pass the name of the input return ( <form onSubmit={handleSubmit(onSubmit)}> <label>First Name</label> <input {...register("firstName", { required: true, maxLength: 20, pattern: /^[A-Za-z]+$/i })} /> {errors?.firstName?.type === "required" && <p>This field is required</p>} {errors?.firstName?.type === "maxLength" && ( <p>First name cannot exceed 20 characters</p> )} {errors?.firstName?.type === "pattern" && ( <p>Alphabetical characters only</p> )} <label>Laste Name</label> <input {...register("lastName", { pattern: /^[A-Za-z]+$/i })} /> {errors?.lastName?.type === "pattern" && ( <p>Alphabetical characters only</p> )} <label>Age</label>a <input {...register("age", { min: 18, max: 99 })} /> {errors.age && ( <p>You Must be older then 18 and younger then 99 years old</p> )} <input type="submit" /> </form> ); } const rootElement = document.getElementById("root"); ReactDOM.render(<App />, rootElement);
Leave a Reply
Want to join the discussion?Feel free to contribute!