react-hook-form
7.91.0 · 23 Oct 2026MIT42M / weekRepositoryHomepagenpmAtom feed
595 stable releases, newest first, by release line. Notes are quoted as the maintainers published them.
7.91.0
23 Oct 2026Improve performance of
Formby reading control from context to avoid unnecessary re-rendersImprove performance of
getValuesby avoiding unnecessary shallow copiesSimplify multipart content-type header filtering
Changed
Improve performance of
Formby reading control from context to avoid unnecessary re-rendersImprove performance of
getValuesby avoiding unnecessary shallow copiesSimplify multipart content-type header filtering
Align form-level validation error types
Fixed
useFieldArraynot registering array rules again afterresetsetValuenot updating field array rows when a parent object is setcreateFormControlkeeping a newer change's error when an olderisValidpass settlesvalidatetreating an empty message array as validresetreleasingkeepIsValidon the next field change or field array operationregisteronly emitting the progressiverequiredattribute when the rule is oncreateFormControldropping the async result of a field unregistered while it validatescreateFormControlsupporting null-prototype objects insetValueFormhandling case-insensitive and parameterized multipartencTypecreateFormControlignoring a staleNaNorInvalid Datevalidation resultSettle submit state when validation throws
Formletting fetch set the multipart boundary for a multipart content-type headercreateFormControlignoring a stale built-in validity result afterresetuseFormrunning the initial validity check when a child subscribed firstFormsending atext/plainbody for atext/plaincontent typecreateFormControlcopying theerrorsprop instead of writing into ituseFormresettingresetOptionswhen removed from propscreateFormControlhandling falsy values correctly in_getDirtyandresetFieldunregisterdropping the field's rules whenkeepValuekeeps only its valueuseFormclearing errors when theerrorsoption is removed or set toundefineduseFieldArraydropping a validation result once the array has changedresetkeeping retained fields disableduseFormre-enabling the form when thedisabledoption is removedformStateproducing a newvalidatingFieldsreference when it changesvalidateFieldvalidating the stored value ofControllerfields with a DOM refuseFormresettingprogressiveoption when removed from propscloneObjectcopying plain objects that have aconstructorkeyuseFieldArrayreindexing row fields when the array has rulesFormmatching JSON content types case-insensitivelydeepEqualcomparing keys as own properties instead of viainregisterkeeping select options picked before the form is readyReport
isReadytouseFormStatemounted with the formuseFieldArrayrevalidating array operations after submit inonBlurmodegetDirtyFieldshandlingnullorundefinedform values when clearing a fieldsetValueupdatingisDirtywhenshouldDirtyfills a field arraydelayErrorflushing the delayed error on blur when blur also validatesuseWatchusing the newdefaultValuewhen the watched name changesdeepEqualcomparing sparse array lengthsFormsending a url-encoded body for a url-encoded content typedeepEqualcomparing empty null-prototype objects by contentEnforce numeric zero
maxLengthregisternot adding an array row when registered without a valueFormmatchingContent-Typeheader names case-insensitivelytriggerrecomputing preservedisValidafterresetuseFieldArrayunregistering on unmount unless a parent array is reindexingsetValuenotifying field arrays so their rows follow the new values
7.90.0
11 Oct 2026Improve performance of
watch,subscribe, scoped subscriptions, dirty field checks and form state fan-outReduce bundle size
Fields named after
Object.prototypemembers not being marked as touched on blur andsetValue
Changed
Improve performance of
watch,subscribe, scoped subscriptions, dirty field checks and form state fan-outReduce bundle size
Fixed
Fields named after
Object.prototypemembers not being marked as touched on blur andsetValueDirty values extraction for fields named
hasOwnPropertycloneObjectdropping the length of sparse arrayscloneObjectfailing on objects with a null prototypeForm options removed from props on re-render not being reset
remove()mishandling duplicated indexes and mutating the indexes passed inuseFieldArrayunregistering fields while a parent array reindexesInput edited before the form is ready being overwritten
useWatchnot updating watched objects after an<Activity>subtree reconnectsuseWatchpreferring its owndefaultValueover formdefaultValuesfor array namesresetwithout values andkeepDefaultValuessettingisDirtyto trueControllerblur validation not working afterresetwatchreading a staleshouldUnregisteroption when a field registersNative validation reading a stale
shouldUseNativeValidationoption when stopping at the first errorForm values stored under a
refkey not being compared correctlysetError,clearErrorsand remaining error updates not producing a newerrorsreference
7.89.0
26 Sep 2026Add optional
@types/reactpeer dependencyvalidateFieldcallingsetCustomValidityon refs that don't implement it under native validationForm-level
validaterunning a stale function instead of the latest one
Changed
Add optional
@types/reactpeer dependency
Fixed
validateFieldcallingsetCustomValidityon refs that don't implement it under native validationForm-level
validaterunning a stale function instead of the latest oneForm-level validation leaving stale errors after a successful re-validation
Form-level validation running more than once per traversal
Stale validation results (resolver, built-in, form-level
validate) being applied afterresetinonChangeandhandleSubmitPending
delayErrortimers for nested paths not being cancelled when a parent validates clean or is reset viaresetFieldgetValues(names, { dirtyFields })returning every row of a field array instead of only the marked entriesField array touched state not being re-indexed when
touchedFieldsis not subscribeduseFieldArrayemittingtouchedFieldsin form state updates when unnecessaryStale field array root error not clearing once an array operation satisfies the rule
useFieldArraymarking the form dirty when the array default isnullDirty state lingering for rows removed from a field array
setValuewithshouldValidatenot revalidatingdepssetValuewithshouldValidatenot triggering validation for a field array rootValidation rules removed from
registeroptions at runtime still being applieduseControllervalidatingrequiredagainst the input value instead of the controlled valueisValidnot recomputing when theerrorsprop is emptiedgetFieldState(name, formState)with a resolver afterreset()
7.88.0
11 Sep 2026<ErrorMessage />component for rendering a field's validation errorsetValuedirty state comparison ignoringvalueAs*/setValueAstransformsNested
delayErrortimers not being cancelled when a parent is cleared or unregistered
Added
<ErrorMessage />component for rendering a field's validation error
Fixed
setValuedirty state comparison ignoringvalueAs*/setValueAstransformsNested
delayErrortimers not being cancelled when a parent is cleared or unregisteredCleared
delayErrorerrors coming back once the pending timer firescriteriaModenot refreshing when form options are updated at runtimeresetFieldleaving stale validating state for the fieldresetnot clearingisValidatingandvalidatingFields, and ignoringkeepIsValidatingreplace()leaving errors and touched state for removed rowsremove()leaking deleted values onto surviving itemshandleSubmitapplying a stale resolver result afterresethandleSubmitdropping resolver-reported root errors on submitStale resolver state updates being applied after
resettriggerdropping registered nested errors when targeting their parenttriggersetting a parent error when the target has only nested resolver errorsuseWatchcompute cache not being initialized with the initial outputflatten/jsonToFormDatanot preservingFileListand not skippingundefinedschemaErrorLookupreporting nested containers as exact-name errorsunregisternot recomputingisValidatingafter clearingvalidatingFieldsunregisterstripping a kept value from the submit payloaditerateFieldsByActiononly breaking out of one loop levelsetErrortypes from a previous validation surviving an overwritereact-serverbuild not being publishedvalidateFieldcallingsetCustomValidityper key in validate-object modeuseFieldArraynot focusing a checkbox or radio in the appended rowuseFieldArraynot reconciling stale fields after anActivitysubtree reconnectsuseFormnever reconciling when anActivitysubtree is hidden on its first rendergetFieldStatenot readingisValidatingfrom the supplied form stateuseFormStatenot re-subscribing whencontrolchangesresetwithkeepValuesleavingdirtyFieldsout of sync withisDirtycloneObjectnot guardingBlobbeforeinstanceof
7.87.0
30 Aug 2026shouldTouchoption fortrigger()OpaqueTypesregistry for opaque leaf typesInconsistent behavior among
useController().field.onChange()-like APIs
Added
shouldTouchoption fortrigger()OpaqueTypesregistry for opaque leaf types
Fixed
Inconsistent behavior among
useController().field.onChange()-like APIsControllerunder a null parent submittingundefinedinstead of a valueERR_MODULE_NOT_FOUNDresolvingreact-hook-formdue to areact-serverdeclaration (Next.js builds)useWatchnever reconciling when anActivitysubtree is hidden on its first renderresetFieldnot recomputingisValidfor subscribe-only consumersgenerateWatchOutputignoringdefaultValuefor an array of namesuseFormStatenever reconciling when anActivitysubtree is hidden on its first render
7.86.0
21 Aug 2026Type-safe
getErrorsmethodImprove
createFormControlImprove clone object check
Added
Type-safe
getErrorsmethod
Performance
Improve
createFormControlImprove clone object check
Avoid cloning values in
unregisterwithout subscribers
Fixed
Field array update leaving stale errors and touched state at the updated index
flattendiscardingFileandBlobvalues instead of treating them as leaf nodesvalidateFieldnot passing the field error tosetCustomValiditywhencriteriaModeisallhasValidationtreating falsy but valid values (min: 0,max: 0,minLength: 0,maxLength: 0,required: '') as no validationsetValuetargeting a nested leaf not notifying aControllerregistered on a field array item rootsetValuesnot updating fields registered under an object or array valueuseWatchreturning a stale value on name change when the new value isnullunregisterinvertingkeepDirtywhen broadcastingisDirty
7.85.0
8 Aug 2026Support
<Activity />getFieldStateerror resolution from a field pathuseWatchdiscardinguseForm({ defaultValues })in favor of its owndefaultValuebefore the form mounts
Added
Support
<Activity />
Fixed
getFieldStateerror resolution from a field pathuseWatchdiscardinguseForm({ defaultValues })in favor of its owndefaultValuebefore the form mountssetValueemitting a duplicatevaluesstate notification for fields without a native input refStale render re-creating a field array path vacated by an array action
useFieldArrayroot-level error (errors.name.root) being lost onappend/prepend/insert/removemin/maxvalidation being skipped forvalueAsDatefields
7.84.0
1 Aug 2026handleSubmitreturns the typed result of theonValidcallback instead of discarding it<Form />supports a function-basedaction(Server Action style) in addition to URL-string actionsImprove performance and reduce bundle size
Improvements
handleSubmitreturns the typed result of theonValidcallback instead of discarding it<Form />supports a function-basedaction(Server Action style) in addition to URL-string actionsImprove performance and reduce bundle size
Fixed
reset()withresetOptions.keepDirtyValuesfreezing clean sibling fields in a nested object when another field in that object is dirtyRestore missing
FieldArrayandFormStatetype exportssetValuesnot notifyinguseFieldArraysubscribers, leaving rendered fields stale
7.83.0
25 Jul 2026Enhance
getEventValueto handle file inputsImprove TypeScript performance with a hard cap at 10 levels of recursive type depth
Clear internal errors state on argument-less
clearErrors()
Improvements
Enhance
getEventValueto handle file inputsImprove TypeScript performance with a hard cap at 10 levels of recursive type depth
Fixed
Clear internal errors state on argument-less
clearErrors()Preserve
dirtyFieldsreference stabilityOld checkbox/radio elements polluting internal field state
useControllernot re-subscribingonChange/onBlurwhencontrolchangesAllow validation messages to be defined even if their related value is
undefined
7.82.0
18 Jul 2026Opt-in
delayErroroption forsetValueto delay validation error updatesExpose
resetDefaultValuesthrough form contextsetValuewithshouldDirtynot updating dirty state correctly when the form is disabled
Added
Opt-in
delayErroroption forsetValueto delay validation error updates
Fixed
Expose
resetDefaultValuesthrough form contextsetValuewithshouldDirtynot updating dirty state correctly when the form is disabledPreserve
dirtyFieldsboolean values for registered array fieldsRestore
FieldArraycomponent export
Performance
Improve
getDirtyFieldsperformance, especially for larger forms and deeply nested values
7.81.0
5 Jul 2026- security
Harden
unset()against prototype-path traversal (__proto__/constructor/prototype), matching the existingset()guard FieldArraycomponent built onuseFieldArrayfor controlled field-array renderingclearErrorschanging thenamevalue fromform.subscribe
Added
FieldArraycomponent built onuseFieldArrayfor controlled field-array rendering
Fixed
clearErrorschanging thenamevalue fromform.subscriberesettriggeringsubscribewith the latest name instead ofundefinedsetValuesleaving stale elements behind when shrinking a field arrayflattenpreservingDatevalues as leaf nodesuseFieldArraymin length validation error changing location in theerrorsobjectuseControllernot reflecting a cleared parent object in controlled fields
Security
- security
Harden
unset()against prototype-path traversal (__proto__/constructor/prototype), matching the existingset()guard
Performance
Improve re-render with
useFieldArrayreset
7.80.0
20 Jun 2026disabledprop support for individual fields withinuseFieldArraydeepEqualincorrectly treating empty array `` and empty plain object{}as equalImprove
onChange,setValid, dirty checking,setValue, andsetValuesperformance
7.79.0
13 Jun 2026disabledoption touseFieldArrayControlleronChangepromise return typedeepEqualfalse positives with shared object references
Added
disabledoption touseFieldArray
Fixed
ControlleronChangepromise return typedeepEqualfalse positives with shared object referencesshouldUseNativeValidationbehavior for radio groupscreateFormControlstability with fast refresh in dev modeStrictModevalue preservation during remountformState.errorsreactivity with React compiler
7.78.0
7 Jun 2026Recover
Controllerfields afterresetwithout rerender (RN issue #13455)useFormState().isDirtyrace with async resolver inonChangemodeUse reactive
valuesprop overdefaultValueswhenshouldUnregisteris true
Fixed
Recover
Controllerfields afterresetwithout rerender (RN issue #13455)useFormState().isDirtyrace with async resolver inonChangemodeUse reactive
valuesprop overdefaultValueswhenshouldUnregisteris truedeepEqualfor empty non-plain objects
Types
Update
dirtyFieldstyping for field arrays with undefined entries
7.77.0
31 May 2026- security
Harden
get()against prototype-path traversal (__proto__/constructor/prototype) resetDefaultValuesAPIStale
isDirtyinsubscribepayload afterreset(..., { keepValues: true })
Added
resetDefaultValuesAPI
Fixed
Stale
isDirtyinsubscribepayload afterreset(..., { keepValues: true })Preserve values with
shouldUnregisterInconsistent
reset({})behavior requiring double-call to take effectFieldArrayerrors overriding nested fields
Security
- security
Harden
get()against prototype-path traversal (__proto__/constructor/prototype)
Performance
Bundle size reduction
7.76.1
23 May 2026Reading the note…
7.76.0
16 May 2026Improve
isDirtysync withdirtyFieldsstatePreserve
formState.defaultValueswhenuseFieldArrayandwatchare used togetherPreserve nested resolver field-array errors in
trigger()
Added
Improve
isDirtysync withdirtyFieldsstate
Fixed
Preserve
formState.defaultValueswhenuseFieldArrayandwatchare used togetherPreserve nested resolver field-array errors in
trigger()Notify all matching field-array roots on nested
setValueupdatesuseFieldArrayremoveleaves array with empty object when usingvaluespropPreserve reset values for conditionally mounted
Controllerfields withshouldUnregisterPropagate
setValuesupdates to mountedControllerfieldsNative validation tooltip suppression caused by duplicate submit-error focus
append({ obj: null })silently replaced bydefaultValuesafterremove()Errors state when using form-level validation
isValidatingreactivity whenvalidatingFieldsis not subscribed
7.75.0
2 May 2026Improve
getDirtyFieldsto prune empty fieldsTypeScript 6.0 support
Include
setValuesinFormProvidercontext value
Added
Improve
getDirtyFieldsto prune empty fieldsTypeScript 6.0 support
Fixed
Include
setValuesinFormProvidercontext valuePreserve watch updates on field array unmount
Prevent
useWatchre-render when unrelated field validation occursRecompute
isDirtyafter re-registering a previously unregistered field
7.74.0
25 Apr 2026setValuesAPIPreserve previous field value when
useControllername changesHandle null parent when unregistering nested field
Added
setValuesAPI
Fixed
Preserve previous field value when
useControllername changesHandle null parent when unregistering nested field
Treat
NaNas empty whenvalueAsNumberistrueinvalidateField
7.73.1
20 Apr 2026Reading the note…
7.73.0
18 Apr 2026Improve
subscribeAPI performanceMemoize submit handler
Improve
deepEqualperformance
Added
Improve
subscribeAPI performance
Performance
Memoize submit handler
Improve
deepEqualperformance
Fixed
Safely access
field._fduring registerImprove
fieldStateerrors when resolver uses dot-notation string keysUpdate state correctly in watch callback with
Controller,trigger, andresetSkip field array validation when mode is
onBlurisDirtyremains false after deleting an item withshouldDirty: trueHandle nested field when parent
defaultValueis nullSkip re-render in
setValuewhen value is unchanged
7.72.1
3 Apr 2026Reading the note…
7.72.0
22 Mar 2026Built-in form-level
validateoptionSubscribe
formStateto track submit stateCheckbox form validation ignored with native validation
Added
Built-in form-level
validateoptionSubscribe
formStateto track submit state
Fixed
Checkbox form validation ignored with native validation
Prevent
useFieldArrayfrom marking unrelated fields as dirty
7.71.2
20 Feb 2026Reading the note…
7.71.1
13 Jan 2026Reading the note…
7.71.0
11 Jan 2026Separate control context to prevent unnecessary rerenders
Memoize
FormProvidercontext value to prevent unnecessary rerendersUpdate
isValidwhen fielddisabledstate changes
7.70.0
4 Jan 2026Prevent field array ghost elements with
keepDirtyValuesImprove
watchreturn typesImprove invalid date handling in
deepEqualand validation
Fixed
Prevent field array ghost elements with
keepDirtyValuesImprove
watchreturn typesImprove invalid date handling in
deepEqualand validationHandle branded types correctly in
DeepPartialFix native validation focus issue
Prevent duplicate subscription trigger in
setValue
7.69.0
20 Dec 2025- security
Security: CVE-2025-67779, CVE-2025-55184, CVE-2025-55183, CVE-2025-55182
Align
<Watch />API withuseWatchPreserve
isValidstate whenkeepIsValidoption is used
Added
Align
<Watch />API withuseWatch
Fixed
- security
Security: CVE-2025-67779, CVE-2025-55184, CVE-2025-55183, CVE-2025-55182
Preserve
isValidstate whenkeepIsValidoption is usedEnsure
createFormControl.subscribesubscription listens only to subscribed changesBatch
isValidatingstate updates with validation resultResolve race condition between
setErrorandsetFocus
7.68.0
3 Dec 2025<FormStateSubscribe />componentClear validation errors synchronously in
reset()to fix Next.js 16 Server Actions issue
7.67.0
28 Nov 2025exactoption foruseControllerpropsAllow
undefinedvalue with asyncdefaultValuesinControllerCorrect
PathValueImpltype inference
7.66.1
17 Nov 2025Reading the note…
7.66.0
31 Oct 2025useWatchanduseControllernow react tonameprop changeswatch()returningundefinedimmediately afterreset()Correct render function parameter typing for
<Watch />component
7.65.0
10 Oct 2025<Watch />componentRespect parent-provided
useFieldArrayrulesgetDirtyFieldssubmit fields withnullvalues when usinguseForm
7.64.0
4 Oct 2025Support optional array fields in
PathValueImpltypePreserve
Controller'sdefaultValuewithshouldUnregisterprop
7.63.0
19 Sep 2025Reading the note…
7.62.0
1 Aug 2025Reading the note…
7.61.1
24 Jul 2025Reading the note…
7.61.0
23 Jul 2025Reading the note…
7.60.0
4 Jul 2025Reading the note…
7.59.0
28 Jun 2025Reading the note…
7.58.1
17 Jun 2025Reading the note…
7.58.0
15 Jun 2025Reading the note…
7.57.0
1 Jun 2025Reading the note…
7.56.4
17 May 2025Reading the note…
7.56.3
7 May 2025Reading the note…
7.56.2
3 May 2025Reading the note…
7.56.1
22 Apr 2025Reading the note…
7.56.0
20 Apr 2025Reading the note…
7.55.0
28 Mar 2025Reading the note…
7.54.2
20 Dec 2024Reading the note…