Keyboard Types validated an order form by hand: a useState per field, a touched flag so the email error waited for blur, and a regular expression. That is a controlled input: React 7,897 state holds the value, and each keystroke re-renders the whole component. Fine for two fields, but a checkout adds an error and touched flag per field, a submitting flag, server errors and focus handling. React Hook Form 351,018 owns that bookkeeping and keeps values in a store outside React state, so a keystroke re-renders only the field that subscribed to it.
| Approach | Version (npm 2,036 ) | License | Fits |
|---|---|---|---|
| useState per field | React 19.2 | MIT | One to three fields, no cross-field rules |
| React Hook Form | 7.88.0 (Sep 2026) | MIT | Most forms; few re-renders |
| TanStack Form | 1.33.5 (Aug 2026) | MIT | Type-first forms, from the makers of TanStack Query 79,069 |
| Formik 34,320 | 2.4.9 (Nov 2025) | Apache-2.0 | Existing code; values live in React state |
Formik was last published in November 2025. The others leave rules to a schema library such as Zod 44,027 (4.6.5), Yup 23,661 (1.7.1) or Valibot 9,023 (1.5.0), all MIT-licensed.