DX
Intuitive, feature-complete API providing a seamless experience to developers when building forms.
Performant, flexible and extensible forms with easy-to-use validation.
Quick start · try it
import { useForm } from "react-hook-form"export default function App() {const {register,handleSubmit,formState: { errors },} = useForm()return (<form onSubmit={handleSubmit(console.log)}><input{...register("firstName", {required: "First name is required",minLength: { value: 2, message: "Min length is 2" },})}/><p>{errors.firstName?.message}</p><input{...register("email", {required: "Email is required",pattern: { value: /^\S+@\S+\.\S+$/, message: "Invalid email" },})}/><p>{errors.email?.message}</p><inputtype="number"{...register("age", {valueAsNumber: true,})}/><p>{errors.age?.message}</p><button type="submit">Submit</button></form>)}
{"errors": {},"isDirty": false,"dirtyFields": {},"touchedFields": {},"isValid": false,"submitCount": 0}
Features
Intuitive, feature-complete API providing a seamless experience to developers when building forms.
Leverage existing HTML markup and validate your forms with our constraint-based validation API.
Package size matters. React Hook Form is a tiny library without any dependencies.
Minimizes the number of re-renders, minimizes validation computation, and provides faster mounting.
Since form state is inherently local, it can be easily adopted without other dependencies.
Strives to provide the best user experience and bring consistent validation strategies.
Sponsors
React Hook Form is free and open source, sustained by the companies and individuals who sponsor its development.
Less code
import { useForm } from "react-hook-form";const Example = () => {const { handleSubmit, register, formState: { errors } } = useForm();const onSubmit = values => console.log(values);return (<form onSubmit={handleSubmit(onSubmit)}><inputtype="email"{...register("email", {required: "Required",pattern: {value: /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}$/i,message: "invalid email address"}})}/>{errors.email && errors.email.message}<input{...register("username", {validate: value => value !== "admin" || "Nice try!"})}/>{errors.username && errors.username.message}<button type="submit">Submit</button></form>);};
Performance
Subscriptions
useWatch re-renders only the components that read the value, not the whole form.
Benchmarks



Adoption
Monthly npm downloads
Recognition
React Hook Form have matured and evolved around hooks. Simplifies a piece of React development.
The winner of 2020 GitNation React OS Award for the category of Productivity Booster.
Featured in the Thoughtworks Technology Radar under Languages & Frameworks, adopted since 2025.
Community
This is where it's at. A React form library that is both well thought out and flexible enough to get out of your way when you need it to. After fussing around with React forms for years, switching to react-hook-form feels like a superpower. Everything runs faster and my code is cleaner.
Creating a form is no more complicated while building a react application with the help of react-hook-form. Most of the time I use this package for creating a form as validation is so much simple here. It is the best form maker for me while I stop to work with formika. Very nice user interface and performance are good.
The best React form library that I have ever used while building a react app because of its utility and simplicity. It has a lot of useful tools and doesn’t require much code compared to Formik, and Redux Form. As the number of re-renders in the application is small and mounting time is less it is super smooth.
Video
Try it
ⓘ Change input values to update watched values
{}ⓘ Validation errors will appear here
ⓘ Touched fields will display here
[]
Form handling doesn't have to be painful. React Hook Form will help you write less code while achieving better performance.