unstale

npm / react-hook-form

react-hook-form

What changed in react-hook-form 7, from its official release notes, upgrade guides and advisories. Sources checked 2026-10-17.

5 breaking5 security15 new APIs and options21 performance8 behavior and defaults2 tooling168 fixes and other

react-hook-form 7224 changes

Breaking changes 5

  • getValues no longer extracts unmarked field array entries.

    7.89.0release notes

  • Changes the location of the minimum-one-item validation error in the errors object.

    7.81.0release notes

  • NaN is no longer treated as empty during validation when valueAsNumber is true.

    7.76.1release notes

  • Field array validation is skipped when mode is onBlur.

    7.73.1release notes

  • Reverts the change that allowed undefined values with async defaultValues in the affected API.

    7.68.0release notes

Security 5

  • Hardens get against prototype-path traversal involving __proto__, constructor, and prototype.

    7.77.0release notes

  • A critical RCE vulnerability was addressed.

    7.69.0release notes

  • A security update addressed CVE-2025-55183.

    7.69.0release notes

  • A security update addressed CVE-2025-55184.

    7.69.0release notes

  • A security update addressed CVE-2025-67779.

    7.69.0release notes

New APIs and options 15

  • Adds an Error Message component for displaying React Hook Form validation errors.

    7.88.0release notes

  • Adds a declaration-merging registry for treating rich third-party types as opaque leaves in recursive type helpers.

    7.87.0release notes

  • trigger() now accepts shouldTouch to mark fields touched after manual or programmatic validation.

    7.87.0release notes

  • Adds a type-safe getErrors method for retrieving form errors.

    7.86.0release notes

  • react-hook-form now supports React Activity.

    7.85.0release notes

  • Exposes resetDefaultValues through form context.

    7.82.0release notes

  • Adds an opt-in delayError option to delay validation error updates.

    7.82.0release notes

  • Adds a FieldArray component for rendering field arrays through control, name, and render props.

    7.81.0release notes

  • Adds a disabled option to useFieldArray; fields expose disabled props when enabled.

    7.79.0release notesrelease notes

  • Adds resetDefaultValues for updating default form values.

    7.77.0release notes

  • FormProvider context now includes setValues.

    7.75.0release notes

  • Adds setValues for updating form values from a callback or form values object.

    7.74.0release notes

  • useForm now supports built-in asynchronous form-level validation returning success or form errors.

    7.72.0release notes

  • Adds a component that re-renders only when the specified form state changes.

    7.68.0release notes

  • Adds the exact prop to control whether a Controller subscribes to all changes in a user object.

    7.67.0release notes

Performance 21

  • Redundant form-state merges during subscriber notifications are skipped.

    7.90.0release notes

  • Allocations are avoided when matching subscription names.

    7.90.0release notes

  • The watch API is faster.

    7.90.0release notes

  • Improves createFormControl performance for developers using the form control API.

    7.86.0release notes

  • Improves performance for workloads with frequent onChange activity.

    7.86.0release notes

  • Avoids unnecessary value cloning during unregister.

    7.86.0release notes

  • Performance was improved and the bundle size was reduced.

    7.84.0release notes

  • TypeScript performance improves with a hard cap at 10 levels of recursive type depth.

    7.83.0release notes

  • Type performance is improved.

    7.83.0release notes

  • Improves dirty field calculation performance, especially for larger forms and deeply nested values.

    7.82.0release notes

  • Improves re-rendering when useFieldArray is reset.

    7.81.0release notes

  • Reduces bundle size.

    7.77.0release notes

  • setValues threads skipClone through setFieldValue to reduce cloning overhead.

    7.76.1release notes

  • Redundant per-field deep clones are skipped during setValues.

    7.76.1release notes

  • useWatch no longer re-renders when validation occurs on an unrelated field.

    7.75.0release notes

  • setValue skips re-rendering when the value is unchanged.

    7.73.1release notes

  • Submission is memoized to improve performance.

    7.73.1release notes

  • Control context is separated to prevent unnecessary rerenders.

    7.71.0release notes

  • FormProvider context value is memoized to prevent unnecessary rerenders.

    7.71.0release notes

  • isValidating state updates are batched with the validation result.

    7.69.0release notes

  • Batch array updates now skip setValid(), avoiding unnecessary validity recalculation during grouped updates.

    7.66.1release notes

Behavior and default changes 8

  • The Form component's submit behavior was enhanced.

    7.84.0release notes

  • getEventValue now handles file inputs.

    7.83.0release notes

  • Improves the setValue API with value shrinking behavior.

    7.81.0release notes

  • Changes in formState errors now cause child components to re-render with the React compiler.

    7.79.0release notes

  • subscribe can now track submit state through formState.

    7.72.0release notes

  • The Watch API was aligned with useWatch.

    7.69.0release notes

  • useController now reacts when its name changes.

    7.66.0release notes

  • useWatch now reacts when its name changes.

    7.66.0release notes

Tooling 2

  • An optional @types/react peer dependency was added for projects that need React type definitions.

    7.89.0release notes

  • Improved watch type definitions for developers using the watch API.

    7.70.0release notes

Fixes and other changes 168

  • Blur validation works correctly after reset.

    7.90.0release notes

  • Dirty fields checking is improved.

    7.90.0release notes

  • Error updates now produce a new errors reference.

    7.90.0release notes

  • Input values edited before the form is ready are no longer lost.

    7.90.0release notes

  • Form-state tracking is preserved across unsubscribe.

    7.90.0release notes

  • Dirty values extraction now works correctly for fields named hasOwnProperty.

    7.90.0release notes

  • Named scoped subscriptions are improved.

    7.90.0release notes

  • Form value comparison now works correctly for fields named ref.

    7.90.0release notes

  • reset no longer incorrectly sets isDirty when keepDefaultValues is used without values.

    7.90.0release notes

  • setError and clearErrors now produce a new errors reference.

    7.90.0release notes

  • Subject subscription handling is improved.

    7.90.0release notes

  • Subscription value handling is improved.

    7.90.0release notes

  • Fields are no longer incorrectly unregistered while a parent array reindexes.

    7.90.0release notes

  • Removing duplicate indexes now works without mutating the provided indexes.

    7.90.0release notes

  • Fields named after Object.prototype members are no longer marked touched incorrectly on blur or setValue.

    7.90.0release notes

  • Native validation now uses current shouldUseNativeValidation options.

    7.90.0release notes

  • Options removed from props are no longer retained across re-renders.

    7.90.0release notes

  • Watched objects now update after an Activity subtree reconnects.

    7.90.0release notes

  • Array names now prioritize form defaultValues correctly.

    7.90.0release notes

  • watch no longer uses stale shouldUnregister options when registering fields.

    7.90.0release notes

  • Duplicate default value fields are no longer present.

    7.89.0release notes

  • Pending delayError timers for nested paths are now handled correctly.

    7.89.0release notes

  • Nested delayError timers no longer remain when a parent validates clean.

    7.89.0release notes

  • Stale form-level errors are cleared after successful re-validation.

    7.89.0release notes

  • Form-level validation now runs once per traversal.

    7.89.0release notes

  • Form state select option handling was fixed.

    7.89.0release notes

  • getFieldState(name, formState) now updates correctly after reset.

    7.89.0release notes

  • isValid is now recomputed when the errors prop is emptied.

    7.89.0release notes

  • Validation rules removed from register options at runtime are no longer kept active.

    7.89.0release notes

  • Built-in validation results no longer remain stale after reset during handleSubmit.

    7.89.0release notes

  • Form-level validation results no longer remain stale after reset.

    7.89.0release notes

  • Built-in validation results no longer remain stale after reset during onChange.

    7.89.0release notes

  • Resolver results no longer remain stale after reset during onChange.

    7.89.0release notes

  • Nested delayError timers are removed when resetField resets a parent.

    7.89.0release notes

  • setValue now revalidates dependencies when shouldValidate is enabled.

    7.89.0release notes

  • setValue now triggers field array root validation when shouldValidate is enabled.

    7.89.0release notes

  • Required validation now uses the controlled value.

    7.89.0release notes

  • Dirty state is cleared for rows removed from a field array.

    7.89.0release notes

  • Stale field array root errors are cleared after an operation satisfies the validation rule.

    7.89.0release notes

  • Touched field array state is now re-indexed when unsubscribed.

    7.89.0release notes

  • Touched fields handling for field arrays was fixed.

    7.89.0release notes

  • A null array default value no longer incorrectly marks the form dirty.

    7.89.0release notes

  • Form-level validation now uses the current validate function instead of a stale one.

    7.89.0release notes

  • Native validation no longer skips refs without setCustomValidity.

    7.89.0release notes

  • Prevents cleared errors from returning after the delayError timer fires.

    7.88.0release notes

  • Preserves FileList during flatten/expand and omits undefined values in jsonToFormData.

    7.88.0release notes

  • Reads isValidating from the supplied form state.

    7.88.0release notes

  • Preserves resolver-reported root errors during handleSubmit().

    7.88.0release notes

  • Restores publication of the React Server build.

    7.88.0release notes

  • Prevents deleted values from leaking onto surviving field-array items.

    7.88.0release notes

  • Fixes errors and touched state remaining for rows removed by replace().

    7.88.0release notes

  • Keeps dirtyFields synchronized with isDirty when keepValues is enabled.

    7.88.0release notes

  • Prevents stale resolver results from updating form state after reset() during handleSubmit().

    7.88.0release notes

  • Prevents stale resolver state updates after reset().

    7.88.0release notes

  • Clears validating fields when reset() runs.

    7.88.0release notes

  • Fixes stale validating state after resetField().

    7.88.0release notes

  • Calls setCustomValidity once instead of once per key in validate-object mode.

    7.88.0release notes

  • Prevents stale validation types from surviving setError() overwrites.

    7.88.0release notes

  • Preserves nested registered errors when trigger() targets their parent.

    7.88.0release notes

  • Prevents incorrect parent errors when triggering fields with only nested resolver errors.

    7.88.0release notes

  • Recomputes isValidating after unregister() clears validating fields.

    7.88.0release notes

  • Preserves kept values in the submit payload after unregister().

    7.88.0release notes

  • Fixes focus behavior for checkboxes and radio buttons in appended rows.

    7.88.0release notes

  • Prevents stale fields after an Activity subtree reconnects.

    7.88.0release notes

  • Correctly reconciles when an Activity subtree is initially hidden.

    7.88.0release notes

  • Re-subscribes when control changes.

    7.88.0release notes

  • Initializes the compute cache with the initial output.

    7.88.0release notes

  • Fixes Controller under a null parent submitting undefined instead of the field value.

    7.87.0release notes

  • Fixes ERR_MODULE_NOT_FOUND when resolving react-hook-form in Next.js builds.

    7.87.0release notes

  • Fixes resetField not recomputing isValid for subscribe-only consumers.

    7.87.0release notes

  • Fixes inconsistent behavior among useController().field.onChange()-like APIs.

    7.87.0release notes

  • Fixes useFormState failing to reconcile when an Activity subtree is hidden on its first render.

    7.87.0release notes

  • Fixes useWatch ignoring defaultValue when watching an array of names.

    7.87.0release notes

  • Fixes useWatch failing to reconcile when an Activity subtree is hidden on its first render.

    7.87.0release notes

  • Fixes notifications for field array item roots.

    7.86.0release notes

  • Prevents stale errors and touched state after updating a field array item.

    7.86.0release notes

  • Prevents stale field names from leaking into persisted formState.

    7.86.0release notes

  • Fixes custom validity handling when criteriaMode is set to all.

    7.86.0release notes

  • Fixes setting values for fields registered under object or array values.

    7.86.0release notes

  • Corrects keepDirty behavior when unregistering fields.

    7.86.0release notes

  • Fixes stale values when the watched name changes to null.

    7.86.0release notes

  • Fixes validation state checks during form operation.

    7.86.0release notes

  • TypeScript error resolution is fixed for field paths.

    7.85.0release notes

  • setValue no longer emits duplicate values state notifications.

    7.85.0release notes

  • Field array root errors are preserved during array mutations.

    7.85.0release notes

  • Field array paths are no longer recreated by stale renders after field array actions.

    7.85.0release notes

  • useWatch now prefers its own defaultValue over the form's defaultValues.

    7.85.0release notes

  • Min/max validation is no longer skipped for valueAsDate fields.

    7.85.0release notes

  • FormState type definitions were fixed.

    7.84.0release notes

  • The FormState export was fixed.

    7.84.0release notes

  • The component was renamed back from FormStateSubscribe to FormState.

    7.84.0release notes

  • setValue now updates FieldArray values correctly.

    7.84.0release notes

  • Using values with keepDirtyValues no longer silently corrupts arrays or freezes objects during refetch.

    7.84.0release notes

  • Old checkbox and radio elements no longer pollute internal field state.

    7.83.0release notes

  • Argument-less clearErrors() now clears internal errors state correctly.

    7.83.0release notes

  • dirtyFields reference stability is preserved.

    7.83.0release notes

  • useController re-subscribes onChange and onBlur when control changes.

    7.83.0release notes

  • Validation messages can be defined even when their related value is undefined.

    7.83.0release notes

  • Preserves boolean values for dirtyFields on registered array fields.

    7.82.0release notes

  • The FieldArray export was fixed.

    7.82.0release notesrelease notes

  • Correctly updates dirty state when shouldDirty is used while the form is disabled.

    7.82.0release notes

  • Fixes the name value exposed through form.subscribe after clearErrors.

    7.81.0release notes

  • Makes reset trigger subscribe with the latest name instead of undefined.

    7.81.0release notes

  • Reflects a cleared parent object in controlled fields.

    7.81.0release notes

  • Controller onChange promise handling was fixed.

    7.79.0release notes

  • createFormControl no longer breaks with Fast Refresh in development mode.

    7.79.0release notes

  • Native validation now behaves natively for radio group field validation.

    7.79.0release notes

  • StrictMode no longer removes a field value before the field mounts again.

    7.79.0release notes

  • Controller fields are recovered after reset without requiring a rerender.

    7.78.0release notes

  • Deep equality handling for empty non-plain objects was fixed.

    7.78.0release notes

  • Typing for field arrays with undefined entries was updated.

    7.78.0release notes

  • The isDirty race with an async resolver in onChange mode was fixed.

    7.78.0release notes

  • The reactive values prop takes precedence over defaultValues when shouldUnregister is true.

    7.78.0release notes

  • Fixes FieldArray errors overriding nested fields.

    7.77.0release notes

  • Fixes stale isDirty values in subscribe payloads after reset with keepValues enabled.

    7.77.0release notes

  • Fixes inconsistent reset({}) behavior that previously required a double call.

    7.77.0release notes

  • Preserves values when shouldUnregister is enabled.

    7.77.0release notes

  • Options are passed through setValues so validation can be enabled.

    7.76.1release notes

  • Whole-form changes no longer emit stale name or type values.

    7.76.1release notes

  • append({ obj: null }) is no longer silently replaced by defaultValues after remove().

    7.76.0release notes

  • Reset values are preserved for conditionally mounted Controller fields with shouldUnregister.

    7.76.0release notes

  • defaultValues are preserved when useFieldArray and watch are used together.

    7.76.0release notes

  • Errors state is fixed when using form level validation.

    7.76.0release notes

  • isDirty now stays synchronized with dirtyFields state.

    7.76.0release notes

  • isValidating reactivity is fixed when validatingFields is not subscribed.

    7.76.0release notes

  • Native validation tooltip suppression caused by duplicate submit-error focus is fixed.

    7.76.0release notes

  • Nested setValue updates now notify all matching field-array roots.

    7.76.0release notes

  • Nested resolver field-array errors are preserved in trigger().

    7.76.0release notes

  • TypeScript 4 compatibility is restored for Watch.

    7.76.0release notes

  • remove no longer leaves an array with an empty object when using the values prop.

    7.76.0release notes

  • values updates now propagate to mounted Controller fields.

    7.76.0release notes

  • Empty nodes with false values are pruned from dirtyFields.

    7.75.0release notes

  • isDirty is recomputed after re-registering a previously unregistered field.

    7.75.0release notes

  • Watch updates are preserved when a field array unmounts.

    7.75.0release notes

  • Handles a null parent when unregistering a nested field.

    7.74.0release notes

  • Preserves the previous field value when the useController name changes.

    7.74.0release notes

  • Treats NaN as empty when valueAsNumber is true during field validation.

    7.74.0release notes

  • fieldState errors are improved when resolvers use dot-notation string keys.

    7.73.1release notes

  • Nested fields are handled correctly when the parent defaultValue is null.

    7.73.1release notes

  • register safely accesses field internals during registration.

    7.73.1release notes

  • Dirty state updates correctly after deleting an item when shouldDirty is true.

    7.73.1release notes

  • State updates correctly in watch callbacks when used with Controller, trigger, and reset.

    7.73.1release notes

  • Numeric string keys in defaultValues are now checked correctly for dirty state.

    7.72.1release notes

  • formState.isValid is now correct when a Controller remounts.

    7.72.1release notes

  • Using shouldDirty no longer pollutes unrelated dirty fields.

    7.72.1release notes

  • Checkbox form validation now works correctly with native validation.

    7.72.0release notes

  • useFieldArray no longer marks unrelated fields as dirty.

    7.72.0release notes

  • Targeted field updates now emit the name signal.

    7.71.2release notes

  • The WatchObserver value parameter now uses DeepPartialSkipArrayKey.

    7.71.2release notes

  • Fixed an issue with booleans_as_integers.

    7.71.1release notes

  • isValid now updates when a field's disabled state changes.

    7.71.0release notes

  • Improved invalid date handling in deepEqual and validation.

    7.70.0release notes

  • DeepPartial now handles branded types correctly.

    7.70.0release notes

  • Prevents ghost elements in field arrays when keepDirtyValues is used.

    7.70.0release notes

  • The deprecated names prop is applied first, then overridden when the new name prop is supplied.

    7.70.0release notes

  • Fixed an issue where native validation did not focus the expected field.

    7.70.0release notes

  • Prevents duplicate subscription triggers when setValue is called.

    7.70.0release notes

  • Each subscription now listens only to the changes it subscribes to.

    7.69.0release notes

  • reset now preserves isValid when keepIsValid is used.

    7.69.0release notes

  • A race condition between setError and setFocus was resolved.

    7.69.0release notes

  • The Watch control prop type was corrected.

    7.69.0release notes

  • Validation errors are cleared synchronously during reset(), fixing a Next.js 16 Server Actions issue.

    7.68.0release notes

  • Allows undefined values with async defaultValues in Controller.

    7.67.0release notes

  • Corrects PathValueImpl type inference.

    7.67.0release notes

  • deepEqual now handles NaN comparisons correctly by using Object.is.

    7.66.1release notes

  • isValid is recomputed after reset when form values update asynchronously, keeping reported validity accurate.

    7.66.1release notes

  • watch no longer returns undefined immediately after reset.

    7.66.0release notes

  • Corrected the render function parameter typing for Watch.

    7.66.0release notes