Controlled checkbox reverts when another state update happens during the click
Les mainteneurs répondent en général sous 1 jour
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Accessibilité débutants
- 18/100
- Type d'issue
- Bug
- Clarté
- Plutôt claire
- Activité
- Active
- Stack technique
- react, typescript
- Domaine
- frontend
Piste de recherche
The payload names no source files, so start from the reproduction: a controlled input type="checkbox" inside a label, with a document-level click listener that calls setState. Run that snippet in Chromium and confirm the box reverts on the first click. Then trace how a state update flushed in a microtask before change re-applies the old checked value. Done means the box stays checked after onChange runs, and the case is covered by a test alongside the behaviour from #116. Coordinate with #116 before starting, since it touches the same code.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
A controlled checkbox can’t be checked when something else updates state from a native click listener, e.g. a click-away listener like the one in MUI’s Snackbar. Redact flushes that update in a microtask before the browser fires change, re-renders the checkbox with the old checked and writes it back to the DOM. The change event then reports the old value, so onChange keeps the box unchecked.
Reproduction
import {useEffect, useState} from 'react'
import {createRoot} from 'react-dom/client'
const App = () => {
const [clicks, setClicks] = useState(0)
const [checked, setChecked] = useState(false)
useEffect(() => {
const onClick = () => setClicks((n) => n + 1)
document.addEventListener('click', onClick)
return () => document.removeEventListener('click', onClick)
}, [])
return (
<label>
<input
type="checkbox"
checked={checked}
onChange={(e) => setChecked(e.target.checked)}
/>
Checked: {String(checked)}, document clicks: {clicks}
</label>
)
}
createRoot(document.getElementById('root')).render(<App />)
Click the checkbox:
| React DOM 19.2.7 | Redact 0.2.3 | |
|---|---|---|
| After the 1st click | Checked: true | Checked: false |
| After the 2nd click | Checked: false | Checked: false |
On Redact the box never stays checked. Tested in Chromium with Vite and the default redact() plugin.
Expected
As in React DOM, the checkbox keeps the value the browser toggled until change has fired. #116 touches the same code (restoring controlled state after change), but this case calls setState and fails before onChange runs.
- Langage dominant
- TypeScript
- Étoiles
- 537
- Forks
- 22
- Merge moyen
- 10 h 27 min
- PR mergées (30 j)
- 40
Préparer son environnement
Ce projet ne fournit ni conteneur de développement, ni Dockerfile, ni guide de contribution : l'installation est à votre charge. Commencez par son README, et consultez notre guide de la première contribution pour les étapes générales.
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/redact
-
Difficulté 2/5 1-3 heures Accessibilité débutants 84/100
TanStack/redact#142 · 3 commentaires ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 85/100
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 4/5 3-5 jours Accessibilité débutants 55/100
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 5/5 Plus d'une semaine Accessibilité débutants 35/100
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de TanStack/redact
Issues similaires
-
unwrapDatabaseError masks real DB errors with TypeError: Cannot convert object to primitive valueOuverte
Difficulté 2/5 1-3 heures Accessibilité débutants 74/100
NEARBuilders/everything-dev#798 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
vercel-labs/durable-harness#53 ·
Les mainteneurs répondent en général sous 1 jour
-
[Bug]: Redesign tab bars ignore clicks on Linux: hidden chat layers keep window drag regionsPeut-être pris Une pull request liée à cette issue est ouverte ou déjà fusionnée. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 82/100
Les mainteneurs répondent en général sous 1 jour
-
experiência: a doc manda subir para o Micro do Supabase, mas não diz que exige plano pago nem quanto custaPeut-être pris Une pull request liée à cette issue est ouverte ou déjà fusionnée. Ouvertearea/docs area/ui enhancement
Difficulté 1/5 1-3 heures Accessibilité débutants 88/100
melgarafael/DeskcommCRM#4098 ·
Les mainteneurs répondent en général sous 1 jour
-
dependencies platform: ios
Difficulté 1/5 1-3 heures Accessibilité débutants 78/100
software-mansion/react-native-executorch#1617 ·
Les mainteneurs répondent en général sous 1 jour