About react-hook-form
A performance and implementation guide for developers building forms with React Hook Form. Its prioritized rules address configuration, subscriptions, controlled components, validation, field arrays, and integrations.
Key features
- 0145 rules in eight categories
- 02Prioritized form guidance
- 03Field subscription practices
- 04Controlled component patterns
- 05Validation and field-array advice
Use cases
- 01Building forms with React Hook Form
- 02Reducing unnecessary form re-renders
- 03Reviewing validation and field-array code
Install
Copy the command and run it in a terminal.
npx skills add https:/ / github.com/ pymodel/ react-frontend-skills --skill react-hook-formAfter installing, type/react-hook-formin Claude Code to confirm it loaded.
Bundled files
References and scripts installed along with SKILL.md.
references/adv-devtools-performance.mdadv-formprovider-memo.mdadv-opaque-types.mdadv-testing-wrapper.mdarray-complete-default-objects.mdarray-separate-crud-operations.mdarray-unique-fieldarray-per-name.mdarray-use-field-id-as-key.mdarray-virtualization-formprovider.mdctrl-avoid-double-registration.mdctrl-controller-field-props.mdctrl-local-state-combination.mdctrl-single-usecontroller-per-component.mdctrl-usecontroller-isolation.mdformcfg-async-default-values.mdformcfg-default-values.mdformcfg-revalidate-mode.mdformcfg-should-unregister.mdformcfg-useeffect-dependency.mdformcfg-validation-mode.mdformstate-avoid-isvalid-with-onsubmit.mdformstate-destructure-formstate.mdformstate-getfieldstate-for-single-field.mdformstate-subscribe-to-specific-fields.mdformstate-useformstate-isolation.mdinteg-mui-controller-pattern.mdinteg-shadcn-form-import.mdinteg-shadcn-select-wiring.mdinteg-typed-submit-server-action.mdinteg-value-transform.mdDetails
From the project READMEReact Hook Form Best Practices
Comprehensive performance optimization guide for React Hook Form applications. Contains 45 rules across 8 categories, prioritized by impact to guide form development, automated refactoring, and code generation.
When to Apply
Reference these guidelines when:
- Writing new forms with React Hook Form
- Configuring useForm options (mode, defaultValues, validation)
- Subscribing to form values with watch/useWatch
- Integrating controlled UI components (MUI, shadcn, Ant Design)
- Managing dynamic field arrays with useFieldArray
- Reviewing forms for performance issues
Rule Categories by Priority
| Priority | Category | Impact | Prefix |
|---|---|---|---|
| 1 | Form Configuration | CRITICAL | formcfg- |
| 2 | Field Subscription | CRITICAL | sub- |
| 3 | Controlled Components | HIGH | ctrl- |
| 4 | Validation Patterns | HIGH | valid- |
| 5 | Field Arrays | MEDIUM-HIGH | array- |
| 6 | State Management | MEDIUM | formstate- |
| 7 | Integration Patterns | MEDIUM | integ- |
| 8 | Advanced Patterns | LOW | adv- |
Quick Reference
1. Form Configuration (CRITICAL)
formcfg-validation-mode- Choose validation mode from UX and validation costformcfg-revalidate-mode- Choose post-submit revalidation deliberatelyformcfg-default-values- Always provide defaultValues for form initializationformcfg-async-default-values- Use async defaultValues for server dataformcfg-should-unregister- Choose shouldUnregister from submission semanticsformcfg-useeffect-dependency- Avoid useForm return object in useEffect dependencies
2. Field Subscription (CRITICAL)
sub-usewatch-over-watch- Use useWatch instead of watch for isolated re-renderssub-watch-specific-fields- Watch specific fields instead of entire formsub-usewatch-with-getvalues- Combine useWatch with getValues for timing safetysub-deep-subscription- Subscribe deep in component tree where data is neededsub-avoid-watch-in-render- Avoid calling watch() in render for one-time readssub-usewatch-default-value- Provide defaultValue to useWatch for initial rendersub-useformcontext-sparingly- Use useFormContext sparingly for deep nesting
3. Controlled Components (HIGH)
ctrl-usecontroller-isolation- Use useController for re-render isolationctrl-avoid-double-registration- Avoid double registration with useControllerctrl-controller-field-props- Wire Controller field props correctly for UI librariesctrl-single-usecontroller-per-component- Split controlled fields when isolation helpsctrl-local-state-combination- Combine local state with useController for UI-only state
4. Validation Patterns (HIGH)
valid-resolver-caching- Define schema outside component for resolver cachingvalid-dynamic-schema-factory- Use schema factory for dynamic validationvalid-error-message-strategy- Render field errors with ErrorMessage (7.88+) or optional chainingvalid-trigger-should-touch- Mark fields touched when triggering validation (7.87+)valid-inline-vs-resolver- Prefer resolver over inline validation for complex rulesvalid-delay-error- Use delayError to debounce rapid error displayvalid-native-validation- Consider native validation for simple formsvalid-form-level-validate- Validate cross-fields with the form-level validate option (7.72+)
5. Field Arrays (MEDIUM-HIGH)
array-use-field-id-as-key- Use field.id as key in useFieldArray mapsarray-complete-default-objects- Provide complete default objects for field array operationsarray-separate-crud-operations- Separate sequential field array operationsarray-unique-fieldarray-per-name- Use single useFieldArray instance per field namearray-virtualization-formprovider- Use FormProvider for virtualized field arrays
6. State Management (MEDIUM)
formstate-destructure-formstate- Destructure formState properties before renderformstate-useformstate-isolation- Use useFormState for isolated state subscriptionsformstate-getfieldstate-for-single-field- Use getFieldState and getErrors for single-field readsformstate-subscribe-to-specific-fields- Subscribe to specific field names in useFormStateformstate-avoid-isvalid-with-onsubmit- Align submit gating with validation mode
7. Integration Patterns (MEDIUM)
integ-shadcn-form-import- Verify shadcn Form component import sourceinteg-shadcn-select-wiring- Wire shadcn Select with onValueChange instead of spreadinteg-mui-controller-pattern- Use Controller for Material-UI componentsinteg-value-transform- Transform values at Controller level for type coercioninteg-typed-submit-server-action- Submit with a typed handleSubmit result or Server Action (7.84+)
8. Advanced Patterns (LOW)
adv-formprovider-memo- Memoize FormProvider children only after profilingadv-devtools-performance- Disable DevTools in production and during performance testingadv-testing-wrapper- Create test wrapper with QueryClient and AuthProvideradv-opaque-types- Register value classes in OpaqueTypes (7.87+)
How to Use
Run in the project root first:
npx -y @pymodel/react-frontend-skills detect # installed vs. targeted versions
npx -y @pymodel/react-frontend-skills scan --skill react-hook-form # deprecated APIs → rule IDs
Read references/<rule-id>.md for each rule above that matches the task and for each scan hit: why it matters, then incorrect vs. correct code.
Related Skills
- For schema validation with Zod resolver, see
zodskill - For React 19 server actions, see
reactskill - For UI/UX form design, see
ui-designskill