PluginBench
Skill
Review
Audit score 70

react-hook-form

pproenca/dot-skills

React Hook Form performance optimization guide with 35 best-practice rules across form configuration, subscriptions, and validation.

What is react-hook-form?

Comprehensive reference for building performant client-side forms with React Hook Form (v7.82+). Covers useForm configuration, field subscriptions, controlled components, validation patterns, state management, field arrays, and UI library integration. Use this when optimizing form performance or integrating RHF with component libraries like MUI, shadcn, or Ant Design.

  • Provides 35 decision-focused rules organized by priority (form config, subscriptions, controlled components, validation, state management, field arrays, integrations)
  • Guides useForm option configuration (mode, defaultValues, validation, reValidateMode, shouldUnregister)
  • Explains field subscription patterns (watch vs useWatch vs subscribe, render-prop components, FormProvider context)
  • Documents controlled component integration with useController and UI libraries (shadcn, MUI, Ant Design)
  • Covers validation patterns including resolver caching, server errors, and async handling
  • Details useFieldArray best practices including disabled option, CRUD operations, and key selection

How to install react-hook-form

npx skills add https://github.com/pproenca/dot-skills --skill react-hook-form
Prerequisites
  • React Hook Form v7.82.0 or later installed
  • Familiarity with React hooks (useEffect, useContext, useCallback)
  • Understanding of controlled vs uncontrolled form components
Claude Code
Cursor
Windsurf
Cline

How to use react-hook-form

  1. 1.Review the Rule Categories by Priority table to identify which categories apply to your form needs
  2. 2.Read the relevant reference files (formcfg-*, sub-*, ctrl-*, valid-*, formstate-*, array-*, integ-*) for detailed explanations and code examples
  3. 3.Apply rules to your useForm configuration, field subscriptions, and component integration patterns
  4. 4.Reference the AGENTS.md compiled document for complete rule details with all examples
  5. 5.Check Related Skills section for complementary guidance (zod for schema validation, react-19 for server actions)

Use cases

Good for
  • Optimizing form re-renders in large forms with many fields by using useWatch and render-prop components instead of watch()
  • Integrating shadcn or MUI form components with React Hook Form using useController and proper field wiring
  • Managing dynamic field arrays with proper key selection and handling the disabled option behavior
  • Surfacing server-side validation errors via setError and handling async submit lifecycle
  • Configuring useForm with async defaultValues for forms initialized from server data
Who it's for
  • React developers building forms with React Hook Form library
  • Frontend engineers optimizing form performance in large applications
  • Developers integrating RHF with UI component libraries (shadcn, MUI, Ant Design)
  • Teams standardizing form patterns and best practices across codebases

react-hook-form FAQ

Should I use watch() or useWatch() for subscribing to form values?

Use useWatch() instead of watch() for isolated re-renders in child components. Avoid calling watch() in render for one-time reads; use useWatch or the Watch render-prop component instead.

How do I prevent unnecessary re-renders when using FormProvider?

React.memo cannot stop context-driven re-renders under FormProvider. Instead, isolate subscriptions using useWatch, useFormState, or render-prop components (Watch, FormStateSubscribe, FieldArray) in dedicated child components.

What's the correct way to wire controlled components from UI libraries?

Use useController to wrap the component and wire the field props correctly. For shadcn Select, use onValueChange instead of spreading field props. For MUI components, ensure value and onChange are properly connected.

How should I handle server-side validation errors in React Hook Form?

Surface server errors via setError('root.serverError', {message: 'error text'}) after an async submit fails. Use handleSubmit's second argument (onInvalid) to handle rejected submissions.

What does the disabled option in useFieldArray do?

The disabled option makes every mutation (append, remove, insert, swap) a silent no-op. Use the HTML disabled attribute on individual fields instead if you need visual disabling without removing from the payload.

Full instructions (SKILL.md)

Source of truth, from pproenca/dot-skills.


name: react-hook-form description: React Hook Form performance optimization for client-side form validation using useForm, useWatch, useController, useFieldArray, the subscribe() API, and the Watch / FormStateSubscribe / FieldArray render-prop components. Covers RHF 7.82 additions including resetDefaultValues() and the disabled field-array option. This skill should be used when building client-side controlled forms with React Hook Form library. This skill does NOT cover React 19 Server Actions, useActionState, or server-side form handling (use react-19 skill for those).

React Hook Form Best Practices by Community

Comprehensive performance optimization guide for React Hook Form applications. Contains 35 rules across 7 categories, each naming a decision that goes wrong by default. Verified against react-hook-form 7.82.0.

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 / subscribe
  • Integrating controlled UI components (MUI, shadcn, Ant Design)
  • Managing dynamic field arrays with useFieldArray
  • Handling async submit, server errors, and submit lifecycle state
  • Reviewing forms for performance issues

When NOT to Use This Skill

  • React 19 Server Actions / useActionState — use the react-19 skill instead
  • Deeply nested, fully type-safe forms — TanStack Form may be a better fit for forms with complex nested schemas; this skill assumes you've already chosen RHF
  • Single-input or trivial forms — uncontrolled <form> + FormData is often simpler than pulling in any library

Rule Categories by Priority

PriorityCategoryImpactPrefix
1Form ConfigurationCRITICALformcfg-
2Field SubscriptionCRITICALsub-
3Controlled ComponentsHIGHctrl-
4Validation PatternsHIGHvalid-
5State ManagementMEDIUM-HIGHformstate-
6Field ArraysMEDIUM-HIGHarray-
7Integration PatternsMEDIUMinteg-

Quick Reference

1. Form Configuration (CRITICAL)

  • formcfg-default-values - Always Provide defaultValues for Form Initialization
  • formcfg-useeffect-dependency - Depend on formState Slices, Not on formState Itself
  • formcfg-validation-mode - Justify Any mode Other Than the Default onSubmit
  • formcfg-revalidate-mode - Keep Default reValidateMode Unless Validation Is Expensive
  • formcfg-should-unregister - Keep shouldUnregister Off Unless Hidden Fields Must Leave the Payload
  • formcfg-transformed-values-generic - Pass the Third useForm Generic When the Resolver Transforms Values
  • formcfg-async-default-values - Use Async defaultValues for Server Data
  • formcfg-disabled-prop - Use the HTML disabled Attribute for Visual Disabling, Not register's disabled Option
  • formcfg-values-prop - Use the values Prop to Keep a Form in Sync with Server Data

2. Field Subscription (CRITICAL)

  • sub-avoid-watch-in-render - Avoid Calling watch() in Render for One-Time Reads
  • sub-memo-cannot-beat-context - React.memo Cannot Stop Context-Driven Re-renders Under FormProvider
  • sub-subscribe-outside-react - Use subscribe() to React to Form Changes Outside the React Lifecycle
  • sub-render-prop-components - Use the Render-Prop Components to Isolate Re-renders Without a Child Component
  • sub-useformcontext-sparingly - Use useFormContext Sparingly for Deep Nesting
  • sub-usewatch-over-watch - Use useWatch Instead of watch for Isolated Re-renders
  • sub-watch-specific-fields - Watch Specific Fields Instead of Entire Form

3. Controlled Components (HIGH)

  • ctrl-usecontroller-isolation - Isolate Controlled Inputs in Dedicated Child Components
  • ctrl-controller-field-props - Wire Controller Field Props Correctly for UI Libraries

4. Validation Patterns (HIGH)

  • valid-resolver-caching - Build the Validation Schema Once, Outside the Render Path
  • valid-valueasnumber-empty-nan - Handle the NaN valueAsNumber Produces for an Empty Input
  • valid-server-errors - Surface Server Errors via setError('root.serverError', ...)
  • valid-delay-error - Use delayError to Debounce Rapid Error Display

5. State Management (MEDIUM-HIGH)

  • formstate-avoid-isvalid-with-onsubmit - Avoid isValid with onSubmit Mode for Button State
  • formstate-destructure-formstate - Read Every formState Property You Depend On During Render
  • formstate-reset-default-values - Rebase Defaults with resetDefaultValues After a Successful Save
  • formstate-handlesubmit-oninvalid - Use handleSubmit's Second Argument to Handle a Rejected Submit
  • formstate-useformstate-isolation - Use useFormState for Isolated State Subscriptions
  • formstate-async-submit-lifecycle - Wrap Async Submit Handlers in try/catch and Reset on isSubmitSuccessful

6. Field Arrays (MEDIUM-HIGH)

  • array-separate-crud-operations - Separate Sequential Field Array Operations
  • array-use-field-id-as-key - Use field.id as Key in useFieldArray Maps
  • array-unique-fieldarray-per-name - Use Single useFieldArray Instance Per Field Name
  • array-disabled-silently-noops - useFieldArray's disabled Option Makes Every Mutation a Silent No-op

7. Integration Patterns (MEDIUM)

  • integ-value-transform - Transform Values at Controller Level for Type Coercion
  • integ-shadcn-form-import - Verify shadcn Form Component Import Source
  • integ-shadcn-select-wiring - Wire shadcn Select with onValueChange Instead of Spread

How to Use

Read individual reference files for detailed explanations and code examples:

Related Skills

  • For schema validation with Zod resolver, see zod skill
  • For React 19 server actions, see react-19 skill
  • For UI/UX form design, see frontend-design skill

Full Compiled Document

For the complete guide with all rules expanded: AGENTS.md

Related skills

More from pproenca/dot-skills and the wider catalog.

REreact-refactor logo

react-refactor

pproenca/dot-skills

Architectural refactoring guide for React applications covering component architecture, state architecture, hook patterns, component decomposition, coupling and cohesion, data flow, and refactoring safety. Use when refactoring React codebases, reviewing PRs for architectural issues, decomposing oversized components, or improving module boundaries. Does NOT cover React 19 API usage (see react skill) or performance optimization (see react-optimise skill).

609 installs
SHshadcn logo

shadcn

pproenca/dot-skills

shadcn/ui component library best practices and patterns (formerly shadcn-ui). This skill should be used when writing, reviewing, or refactoring shadcn/ui components to ensure proper architecture, accessibility, and performance. Triggers on tasks involving Radix primitives, Tailwind styling, form validation with React Hook Form, data tables, theming, or component composition patterns.

622 installs
TEterminal-ui logo

terminal-ui

pproenca/dot-skills

Terminal User Interface (TUI) performance and UX guidelines for TypeScript applications using Ink and Clack. This skill should be used when building CLI tools, interactive terminal prompts, or developer tooling with TUI components. Triggers on tasks involving TUI components, CLI prompts, terminal rendering, keyboard input handling, or developer tooling.

636 installs
TYtypescript logo

typescript

pproenca/dot-skills

TypeScript performance, tsconfig, type errors, and async patterns optimization.

1.5k installsAudited
UIui-design logo

ui-design

pproenca/dot-skills

UI/UX and frontend design best practices guidelines (formerly frontend-design). This skill should be used when writing, reviewing, or designing frontend code to ensure accessibility, performance, and usability. Triggers on tasks involving HTML structure, CSS styling, responsive layouts, form design, animations, or accessibility improvements.

640 installsAudited
VIvitest logo

vitest

pproenca/dot-skills

Vitest testing framework patterns: async, mocking, setup, snapshots, and performance optimization.

4.2k installsAudited