`isDefaultValue` is wrong when a field-level `defaultValue` is `null`
I maintainer di solito rispondono entro 1 giorno
Valutazione
- Difficoltà
- 2/5
- Tempo stimato
- 1-3 ore
- Idoneità per principianti
- 76/100
- Tipo di issue
- Bug
- Chiarezza
- Specificata chiaramente
- Stato di attività
- Attiva
- Stack tecnologico
- typescript
- Ambito
- frontend
Direzione di ricerca
Leggi la derivazione del valore predefinito in packages/form-core/src/FormApi.ts intorno alle righe 1236–1241 del collegamento, poi confrontala con la gestione dei valori predefiniti a livello di campo descritta per FieldApi e form.reset(). Riproduci il problema con lo snippet TypeScript che usa @tanstack/form-core. Il lavoro è concluso quando isDefaultValue è true esattamente per il valore ripristinato da reset, anche quando il valore predefinito del campo è null.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Describe the bug
When a field has defaultValue: null and the form-level default for that field is anything other than null (missing, undefined, or a different value), isDefaultValue does not match what form.reset() restores:
- The field holds its default (
null) butfield.state.meta.isDefaultValueandform.state.isDefaultValuearefalse, right after mount and afterform.reset(). - Setting the value to the form-level default (or to
undefinedwhen there is none) reportsisDefaultValue: true, althoughform.reset()then changes the value back tonull.
Field-level defaults of 0, false, '' or any non-null value work as expected.
Your minimal, reproducible example
The snippet under "Steps to reproduce" is self-contained and only needs @tanstack/form-core.
Steps to reproduce
import { FieldApi, FormApi } from '@tanstack/form-core'
const form = new FormApi({
defaultValues: { name: 'form' as string | null },
})
form.mount()
const field = new FieldApi({ form, name: 'name', defaultValue: null })
field.mount()
console.log(field.state.value, field.state.meta.isDefaultValue)
// null false (expected: null true)
field.setValue('form')
console.log(field.state.meta.isDefaultValue)
// true (expected: false)
form.reset()
console.log(field.state.value, field.state.meta.isDefaultValue)
// null false (expected: null true)
Without a form-level default for the field (defaultValues: {} as { name?: string | null }), the result is the same, and field.setValue(undefined) reports isDefaultValue: true.
Expected behavior
isDefaultValue should be true exactly when the current value is the one form.reset() restores, as established in #1973 and #2006. With a field-level defaultValue: null that value is null.
How often does this bug happen?
Every time
Screenshots or Videos
No response
Platform
macOS, reproduced in Node with Vitest (no browser involved)
TanStack Form adapter
vanilla
TanStack Form version
v1.33.5
TypeScript version
v5.9.3
Additional context
The derivation resolves the default with fieldDefault ?? formDefault, so a field-level null falls through to the form-level default:
https://github.com/TanStack/form/blob/2216fdedf0a5ff17e4ef8567e1321442639b96ca/packages/form-core/src/FormApi.ts#L1236-L1241
form.reset() and FieldApi treat a field-level default as set when it is !== undefined, so null is applied as a default there. This was introduced in #2006 (1.32.0) and noted in an unanswered review comment: https://github.com/TanStack/form/pull/2006#discussion_r3215386716
Related: #2425 fixes the same ?? in resetField. This issue is separate, since it also affects mount and form.reset().
Happy to open a PR if a fix is wanted on the 1.x line.
- Lingua principale
- TypeScript
- Stelle
- 6.7k
- Fork
- 695
- Merge medio
- 1g 9h
- PR unite (30g)
- 12
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Ha un modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di TanStack/form
-
Async validator doesn't re-trigger `isValidating` after first failed validationForse già presa @drewsephski l’ha presa 12 giorni fa. Aperta
Difficoltà 2/5 1-2 giorni Idoneità per principianti 72/100
I maintainer di solito rispondono entro 1 giorno
-
[v2 alpha] devtools are always light modeForse già presa @dikshit-n l’ha presa 46 giorni fa. Apertaarea: runtime scope: devtools type: bug v2
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
I maintainer di solito rispondono entro 1 giorno
-
FormGroupApi.getRelatedFields and FieldApi.validate() use unguarded startsWith for group membership, matching unrelated fields with a shared name prefixForse già presa @HDPark95 l’ha presa 65 giorni fa. Apertaarea: runtime scope: core type: bug v1
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
TanStack/form#2337 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
FormApi: onSubmit/onServer error cleared on any non-matching validation cause, not just 'change'Forse di nuovo libera Una pull request per questa issue è stata chiusa senza essere unita. Apertav1 v2: needs investigation
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
I maintainer di solito rispondono entro 1 giorno
-
setFieldValue clears errorMap.onMount but leaves errorSourceMap.onMount staleForse già presa @alliasgher l’ha presa 51 giorni fa. Apertav1 v2: needs investigation
Difficoltà 2/5 1-3 ore Idoneità per principianti 85/100
TanStack/form#2294 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di TanStack/form
Issue simili
-
Edit: Travel Mix (RO)Apertacheck:failed streams:edit
Difficoltà 2/5 1-3 ore Idoneità per principianti 64/100
iptv-org/iptv#55901 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
I maintainer di solito rispondono entro 2 giorni
-
package:ios ships XCFrameworks with absolute symlinks, which SwiftPM refuses to extractForse già presa @cusnirvladislav l’ha presa oggi. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
callstackincubator/rock#740 ·
-
S: triage
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
I maintainer di solito rispondono entro 2 giorni
-
area:workflow bug ready-for-human
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 78/100
fil-donadoni/tolaria#6108 ·
I maintainer di solito rispondono entro 1 giorno