Switch, ScrollView and ActivityIndicator Drop Every aria-* Prop
Switch, ScrollView and ActivityIndicator accept all View props in their
types and docs, but in React Native 0.88 they pass aria-*, id and tabIndex
to the native side unconverted, where nothing reads them.
<Switch aria-label="Wi-Fi" /> has no name; accessibilityLabel works.
- Checked: 22–23 October 2026
- Versions: React Native 0.88.0
- Devices: iOS 27.0 Simulator (Accessibility Inspector), Android 17 emulator
(
uiautomator dump) - Upstream: react/react-native#59379: open
How It Was Checked
Pairs in the reproducer:
the left element uses the aria-* prop, the right one its accessibility*
form. The accessibility tree was read without a screen reader.
<>
<Switch aria-label="Wi-Fi A" value={on} onValueChange={setOn} />
<Switch accessibilityLabel="Wi-Fi B" value={on} onValueChange={setOn} />
</>
Result
| Pair | aria-label | accessibilityLabel |
|---|---|---|
Switch, Android | content-desc="", marked NAF (focusable, but no text or description) | content-desc="Wi-Fi B" |
Switch, iOS | No label | Label "Wi-Fi B" |
ActivityIndicator, Android | content-desc="" | content-desc="Loading D" |
ScrollView, Android | content-desc="" | content-desc="Photos F" |
- The cause:
View,Text,TextInputandImageconvertaria-*toaccessibility*in JS.Switch,ScrollViewandActivityIndicatorrender a native component directly and convert nothing.RefreshControlandModaldo the same (read from the code, not run). - On iOS a
ScrollViewis not an accessibility element, so a label does not apply there;ActivityIndicatoron iOS ignores evenaccessibilityLabel, see a separate note. - What works: the
accessibility*form of the same prop.
Upstream
- react/react-native#59377: the issue for all components.
- react/react-native#59379 adds the conversion to the three components; open on 27 October 2026.
- react/react-native#59072
maps only
aria-hiddenonScrollViewandActivityIndicator; open on 27 October 2026.