Validation / When errors appear
When errors appear
A field that shouts at you on the first keystroke is a field people switch off. The timing is the feature.
Default showError="touched"
STAGEBEHAVIOURWHY
Typing, never blurredSilentThe value is incomplete because they are still writing it
First blur, invalidShow the errorThey have finished and it is wrong, so now it helps
Typing after an errorRe-validate liveThe message clears the instant the value is valid
Blur while empty, optionalSilentAn empty optional field is valid
Programmatic resetClear and untouchA reset form must not show stale errors
And it is announced once
The message is linked by aria-describedby and carries role="alert". It is asserted not to appear before the first blur — announcing on every keystroke is precisely what makes a field unusable with a screen reader, so the silence is a requirement, not an omission.
Validity is derived, not stored
Validity is computed during render from the current value and the current constraints. It is never written to state in an effect, so there is no frame in which the value and its validity disagree, and no cascade of re-renders when a constraint prop changes.