handleSubmit calls onSubmit again while a submit is still pending (since 1.33.1)
Les mainteneurs répondent en général sous 1 jour
Évaluation
- Difficulté
- 2/5
- Temps estimé
- 1-3 heures
- Accessibilité débutants
- 78/100
- Type d'issue
- Bug
- Clarté
- Clairement spécifiée
- Activité
- Active
- Stack technique
- react, typescript
- Domaine
- frontend
Piste de recherche
Le rapport signale _handleSubmit et this.baseStore.state.isSubmitting dans @tanstack/form-core ; commencez par suivre le retour anticipé et la vérification de la tentative de soumission décrits dans l’issue. Reproduisez le problème avec le script Node fourni sur le code actuel, puis ajoutez ou mettez à jour un test de régression pour une deuxième soumission pendant un onSubmit en attente ; le travail est terminé lorsque onSubmit n’est appelé qu’une seule fois et que le comportement de nouvelle soumission de #2120 est préservé.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Describe the bug
Since #2120 ("clear stale onBlur errors on re-submission", released in 1.33.1), handleSubmit skips its !canSubmit early return on every attempt after the first. canSubmit is also false while a submit is in flight, so a second handleSubmit during a pending onSubmit now runs validation and calls onSubmit again. Up to 1.33.0 that second call returned early.
In practice: a double tap on a submit button, or Enter / the keyboard's "go" pressed twice, sends the request twice. We hit it on a sign-in form and a comment composer in React Native, where the keyboard submit bypasses a disabled button.
Your minimal, reproducible example
No sandbox, it needs only @tanstack/form-core in Node:
// npm i @tanstack/[email protected], then: node repro.mjs
import { FormApi } from '@tanstack/form-core';
const pending = [];
const form = new FormApi({
defaultValues: { name: 'Ada' },
onSubmit: () => new Promise((resolve) => pending.push(resolve)),
});
form.mount();
const first = form.handleSubmit();
await new Promise((resolve) => setTimeout(resolve, 0));
console.log('isSubmitting:', form.state.isSubmitting, 'canSubmit:', form.state.canSubmit);
const second = form.handleSubmit();
await new Promise((resolve) => setTimeout(resolve, 0));
console.log('onSubmit calls:', pending.length, '(expected 1)');
pending.forEach((resolve) => resolve());
await Promise.all([first, second]);
Steps to reproduce
- Run the script with
@tanstack/[email protected]:isSubmitting: true canSubmit: false,onSubmit calls: 1. - Run it with
@tanstack/[email protected]: same state,onSubmit calls: 2.
Expected behavior
A handleSubmit that arrives while isSubmitting is true does not call onSubmit again, as before #2120. Keeping the re-submission behaviour #2120 added and also returning early when this.baseStore.state.isSubmitting is true would cover both.
How often does this bug happen?
Every time
Platform
@tanstack/form-core1.33.5 (via@tanstack/react-form1.33.5)- Node 26, and React Native 0.88 / Hermes in the app
TanStack Form adapter
react-form
TanStack Form version
1.33.5
TypeScript version
5.9
Additional context
The change is in _handleSubmit: if (!this.state.canSubmit && ...) { if (this.baseStore.state.submissionAttempts <= 1) { ...; return; } }. We now wrap onSubmit in a single-flight guard on our side.
- Langage dominant
- TypeScript
- Étoiles
- 6.8k
- Forks
- 711
- Merge moyen
- 1 j 6 h
- PR mergées (30 j)
- 12
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
-
Submit listener exceptions leave isSubmitting stuck truePeut-être pris @henricop l’a pris aujourd’hui. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
Les mainteneurs répondent en général sous 1 jour
-
[v2] FieldWithValue<T> erases field.name to any instead of stringPeut-être pris @Priyeshshrivastav l’a pris il y a 3 jours. 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
-
`isDefaultValue` is wrong when a field-level `defaultValue` is `null`Peut-être pris @fenet-as l’a pris il y a 25 jours. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
TanStack/form#2427 · 1 commentaire ·
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 30 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 64 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
Toutes les issues de TanStack/form
Issues similaires
-
Billion-context documentation addendum: nudge is independent of window occupancy. | billion-context 文档补充:nudge 与窗口占用无关Peut-être pris Une pull request liée à cette issue est ouverte ou déjà fusionnée. Ouverte
Difficulté 1/5 1-3 heures Accessibilité débutants 86/100
ranxianglei/billion-context#5893 ·
Les mainteneurs répondent en général sous 1 jour
-
stringify escapes leading digits in pseudo-class arguments (:nth-child(1) becomes :nth-child(\31 ))Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 83/100
Les mainteneurs répondent en général sous 1 jour
-
enhancement security severity:low
Difficulté 2/5 1-3 heures Accessibilité débutants 83/100
Battle-Cattle/BCUK-Bot-4#959 ·
Les mainteneurs répondent en général sous 1 jour
-
[Bug]: Claude account rows no longer show the email (since #8055), so "Account 1, 2, 3" cannot be told apartPeut-être pris Une pull request liée à cette issue est ouverte ou déjà fusionnée. Ouverteaccount-pool bug gui
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
lidge-jun/opencodex#8286 · 2 commentaires · 1 réaction ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 1/5 Moins d'une heure Accessibilité débutants 72/100
Les mainteneurs répondent en général sous 1 jour