← Default view
FORM STATE REACT · 2026 angles 7 citations 280 react 19.2.7 isDirty false errors 3
Decision console · 2026-07-13 · expedition synthesis

The library owns the client.
The Action is just the wire.

Seven angles on the 2026 React form stack, resolved into one readout. React Hook Form still wins. React's own primitives are a submission layer, not a form layer. Standard Schema made the validator swappable. And every hard pattern collapses into a single question — where do the field values live?

defaultStack.getValues() — new React app, 2026
enginethe form layer
⭐ 44.8k · 58M downloads/week · 3 open issues[38]
DEFAULT
schemathe validator
≈224M downloads/week — more than React itself. Swappable at the form boundary, not at the ORM/RPC boundary.
DEFAULT
field uilayout + a11y
your kit's <Field> primitives[3]
Engine-agnostic in every kit now. You still hand-write the Controller/field.state bridge per component.
BYO ENGINE
submitthe network boundary
Owns the round-trip only. Pairing it with RHF in the App Router still needs a timestamp-field hack to force state through.[10]
WIRE ONLY
swap if…escape hatches
One form core across frameworks or genuinely deep typed paths[5] → TanStack. Must work before hydration[6] → Conform.
CONDITIONAL
01 Telemetry
58M
RHF / week
Week of 2026-07-05. v7.81.0 stable, 8.0.0-beta.3 in flight.[1]
224M
Zod / week
More weekly downloads than React.[2]
0
form APIs since 19.0
Everything shipped Dec 2024. 19.1 and 19.2 added nothing.[8]
62 kB
Zod vs 12.87 kB RHF
The validator dwarfs the form library. "RHF is tiny" quotes 2022 versions — RHF 12.87 vs Formik 13.12 kB.[17]
69M
@standard-schema/spec
v1.1.0 (Dec 2025). Every validator now speaks one ~standard interface.[52]
02 Central readout

Where do the field values live? // the one question

Across the two hardest angles, one design choice generates all the others. Conditional fields, wizards, field arrays, the re-render budget and even file uploads are downstream of a single decision each library made about value storage.

a mutable ref,
outside React
On unmount
Value kept. A hidden step in a wizard still holds its data.
Array rows
Keyed by the generated field.idkey={index} is the bug.[39]
Best at
Big flat forms. The refs are why the render budget stays flat.
an external
store
On unmount
Value kept — and so are stale errors, which silently block submit.[18]
Array rows
The official guide keys by index[41] — removing item 2 from [1,2,3,4] yields [1,3,4,4].[40]
Best at
Deeply dynamic, deeply typed paths. One core across frameworks.
the DOM
itself
On unmount
Field deleted. Unmounted means gone — unless wrapped in PreserveBoundary.[19]
Array rows
Each row gets a task.key from field metadata.[43]
Best at
Progressive enhancement. The form works before hydration; the server is the validator.
Downstream of this one choice:
conditional fields→ wizards→ field arrays→ re-render budget→ dirty tracking→ file uploads
Uploads land here too: a File never deep-equals itself, so the field must hold the upload key, not the File, or dirty-tracking goes insane.[20]
03 Error summary — 3 unresolved
⚠ formState.errors — open risks that survive the 2026 stack
engine.reactCompiler
RHF v7 is structurally incompatible with the React Compiler.
v8-beta's headline feature is fixing exactly that[23] — so the safe default sits on a beta migration path. Budget for the v7→v8 move rather than pretending it isn't coming.
router.unsavedChangesGuard
The Next.js App Router still has no first-party navigation guard.
Requested since March 2023, still open.[24] React Router 7[25] and TanStack Router[51] both solved it. If you are choosing a router for a form-heavy app, that gap is a real input to the decision.
form.action → uncontrolled fields
An uncontrolled form is auto-cleared after a form action — even when the action returns a validation error.
The tracking issue was closed as not planned.[9] Meanwhile RHF's maintainers have taken no official position on Server Actions at all.[11] The seam between library and Action is unowned by both sides.
04 <fieldset disabled> — React's own primitives

A complete submission layer. An empty form layer.

React 19.0, Dec 2024 — and nothing since.[7] React 19.2.7 is current; there is no React 20.[53]

Owns — the network boundary

  • <form action>
  • useActionState — pending, result
  • useFormStatus
  • useOptimistic

Owns nothing — the fields

  • field-level validation
  • dirty / touched tracking
  • field arrays
  • error focus management
React
The 2026 shape: library owns the client, Action owns the wire. The seam between them is not well supported — and both sides have declined to own it.
05 Submit-path constraints — the bytes never travel through the form
Server Action body
1 MB cap

Next.js default limit on Server Action request bodies.[21] Presign, PUT direct to storage, and let the field carry the object key.

Upload progress
fetch → ✗ · XHR → ✓

fetch cannot report upload progress, by design.[22] A progress bar in 2026 still means XMLHttpRequest.

Single presigned PUT
≈100 MiB ceiling

Above that it becomes abusive[49] — go multipart, or tus for resumable, unbounded uploads.[50]

Autosave
debounce + If-Match

Autosave is a debounce plus an ETag precondition, not a merge algorithm.[54]

06 Sub-angle status — 7/7 resolved
The form-library landscape
RHF (7.81.0, 58M/week, v8 in beta) remains the default; TanStack Form 1.33.2 is the credible challenger with a framework-agnostic core, better path types and self-admitted verbosity; Conform owns progressive enhancement; Formik is a zombie and React Final Form is in maintenance limbo.
expedition
109cites · 18m
React's native form primitives
Froze at 19.0. A submission layer, not a form layer — they own pending / error / optimistic state across the network boundary, and own nothing about the fields.
survey
25cites · 9m
The validation & schema layer
Standard Schema v1 turned the validator into a swappable dependency. Zod 4 stays the default, Valibot wins the client bundle, ArkType wins raw throughput — and only one of them can own your shared client/server schema.
survey
33cites · 11m
The hard parts: arrays, conditionals, wizards, render budget
Where the three mainstream libraries actually break — with the API-level specifics that decide it. This is the angle that produced the central readout above.
survey
34cites · 12m
Testing forms: which tier catches what
Vitest + schema unit tests + jsdom component tests, with Browser Mode as the real middle tier and Playwright reserved for the three or four flows that actually touch the network.
survey
32cites · 11m
Uploads, autosave, unsaved-changes guards
Bytes bypass your form: the browser presigns and uploads direct-to-storage while the form only carries a key — and progress still means XHR, not fetch.
survey
36cites · 12m
Wiring form engines into UI kits
The kits stopped picking an engine for you: shadcn's Field, Base UI's Field and React Aria are all engine-agnostic layout/a11y primitives — the real cost is the per-component bridge you still hand-write.
recon
11cites · 4m
07 Package registry — resolved dependencies
React Hook Form
7.81.0 · ⭐ 44.8k · v8-beta.3
Values in mutable refs. 3 open issues.[35]
DEFAULT
TanStack Form
1.33.2 · ⭐ 6.6k
Framework-agnostic core, deep typed paths, self-admitted verbosity.[42]
CHALLENGER
Conform
1.19.4 · ⭐ 2.6k
FormData-first. The only one that works before hydration.[37]
PRE-HYDRATION
Formik
2.4.9 · ⭐ 34.3k
Zero commits in six months, 704 open issues[32]; the author says on the record he stopped in 2020.[33]
ZOMBIE
React Final Form
⭐ 7.4k
One bug-fix burst a year, no modern-React story.[34]
LIMBO
Zod
4.4.3 · ~62 kB gzip
The only one that can own the shared client/server schema.[16]
DEFAULT SCHEMA
Valibot
1.4.2 · ⭐ 8.8k
1.37 kB vs Zod's 17.7 kB for a login schema.[55]
BUNDLE WINNER
ArkType
2.2.3 · ⭐ 7.8k
≈4× Zod v4 validation throughput; schemas in TS syntax.[56]
THROUGHPUT
Standard Schema
v1.1 · ⭐ 3.6k
TanStack consumes it natively[13]; RHF via standardSchemaResolver[14]; even Yup 1.7 implements it.[15]
THE INTERFACE
shadcn/ui
engine-agnostic
Replaced the RHF-only <Form>; documents RHF, TanStack Form and Formisch side by side.[58]
BYO ENGINE
Base UI
native constraint validation
Pairs with React Aria, which does the a11y work without an engine.[47] Mantine is the last kit still shipping its own engine.[48]
BYO ENGINE
Vitest
stable since v4 · ⭐ 17k
The real middle tier: real events, real focus, real constraint validation.[44]
TEST TIER 2
Playwright
⭐ 93k
Reserved for the three or four flows that actually touch the network.[45]
TEST TIER 3
7 angles · 280 citations · resolved 2026-07-13 Read the full expedition → · Atlas