`isDefaultValue` is wrong when a field-level `defaultValue` is `null`
Les mainteneurs répondent en général sous 1 jour
Évaluation
- Difficulté
- 2/5
- Temps estimé
- 1-3 heures
- Accessibilité débutants
- 76/100
- Type d'issue
- Bug
- Clarté
- Clairement spécifiée
- Activité
- Active
- Stack technique
- typescript
- Domaine
- frontend
Piste de recherche
Lisez la dérivation de la valeur par défaut dans packages/form-core/src/FormApi.ts autour des lignes 1236–1241 du lien, puis comparez-la au traitement des valeurs par défaut au niveau du champ décrit pour FieldApi et form.reset(). Reproduisez le problème avec l’extrait TypeScript utilisant @tanstack/form-core. Le travail est terminé lorsque isDefaultValue vaut true exactement pour la valeur rétablie par reset, y compris lorsque la valeur par défaut du champ est null.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
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.
- Langage dominant
- TypeScript
- Étoiles
- 6.8k
- Forks
- 705
- Merge moyen
- 1 j 7 h
- PR mergées (30 j)
- 13
Préparer son environnement
- Aucun Dockerfile ni fichier Docker Compose
- Propose un modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de TanStack/form
-
[v2] FieldWithValue<T> erases field.name to any instead of stringPeut-être pris @Priyeshshrivastav l’a pris il y a 1 jour. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 79/100
TanStack/form#2465 · 3 commentaires ·
Les mainteneurs répondent en général sous 1 jour
-
Async validator doesn't re-trigger `isValidating` after first failed validationPeut-être pris @drewsephski l’a pris il y a 28 jours. Ouverte
Difficulté 2/5 1-2 jours Accessibilité débutants 72/100
Les mainteneurs répondent en général sous 1 jour
-
[v2 alpha] devtools are always light modePeut-être pris @dikshit-n l’a pris il y a 63 jours. Ouvertearea: runtime scope: devtools type: bug v2
Difficulté 2/5 1-3 heures Accessibilité débutants 65/100
Les mainteneurs répondent en général sous 1 jour
-
FormGroupApi.getRelatedFields and FieldApi.validate() use unguarded startsWith for group membership, matching unrelated fields with a shared name prefixPeut-être pris @HDPark95 l’a pris il y a 81 jours. Ouvertearea: runtime scope: core type: bug v1
Difficulté 2/5 1-3 heures Accessibilité débutants 82/100
TanStack/form#2337 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
FormApi: onSubmit/onServer error cleared on any non-matching validation cause, not just 'change'Peut-être à nouveau libre Une pull request pour cette issue a été fermée sans être fusionnée. Ouvertev1 v2: needs investigation
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de TanStack/form
Issues similaires
-
area: web bug
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
kinqsradio/orbyn-engineering#227 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 85/100
joeldesante/TurfBuilder#258 ·
Les mainteneurs répondent en général sous 1 jour
-
bug
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
ncecere/open-mcp-portal#85 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 63/100
loathers/garbage-collector#2865 ·
Les mainteneurs répondent en général sous 1 jour
-
test-reliability
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
Azure/azure-sdk-for-js#40672 · 1 réaction ·
Les mainteneurs répondent en général sous 1 jour