Overview
TanStack Form is a headless form library with deep TypeScript integration. It provides field-level and form-level validation (sync/async), array fields, linked/dependent fields, fine-grained reactivity, and schema validation adapter support (Zod, Valibot, Yup).
Package: @tanstack/react-form
Adapters: @tanstack/zod-form-adapter, @tanstack/valibot-form-adapter
Status: Stable (v1)
Installation
Core: useForm
Fields (form.Field)
Validation
Validation Timing
Synchronous Validation
Asynchronous Validation
Schema Validation (Zod)
Form-Level Validation
Linked/Dependent Fields
Array Fields
Array Methods
Listeners (Side Effects)
Reactivity (form.Subscribe & useStore)
Form State
Field State
FormApi Methods
Shared Form Options (formOptions)
Server-Side Validation
TypeScript Integration
Best Practices
- Always call
e.preventDefault()ande.stopPropagation()on form submit - Always attach
onBlur={field.handleBlur}for blur validation and isTouched tracking - Use
mode="array"for array fields to get array methods - Return
undefined(not null/false) for valid validators - Use
asyncDebounceMsfor async validators to prevent API spam - Check
isTouchedbefore showing errors for better UX - Use
form.Subscribewith selectors to minimize re-renders - Use
formOptionsfor shared configuration across components - Use schema validators (Zod/Valibot) for complex validation rules
- Use
onChangeListenTofor cross-field validation dependencies
Common Pitfalls
- Forgetting
e.preventDefault()on form submit (causes page reload) - Not attaching
onBlurto inputs (breaks blur validation and isTouched) - Returning
nullorfalseinstead ofundefinedfor valid fields - Using
mode="array"incorrectly (only needed on the array field itself, not sub-fields) - Subscribing to entire form state instead of using selectors (unnecessary re-renders)
- Not using
asyncDebounceMswith async validators (fires on every keystroke)


