Touchable* Drop role and Some aria-* Props
Touchable* build their native view from a fixed list of props, and in React
Native 0.88 role is on none of the lists. <TouchableOpacity role="button">
has no role; accessibilityRole="button" works. TouchableWithoutFeedback also
drops aria-label, and TouchableHighlight drops aria-checked and the other
aria-* state props.
- 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#59378: open
How It Was Checked
Pairs in the reproducer,
the aria-* or role prop next to its accessibility* form:
<>
<TouchableOpacity role="button" onPress={save}>
<Text>Save G</Text>
</TouchableOpacity>
<TouchableOpacity accessibilityRole="button" onPress={save}>
<Text>Save H</Text>
</TouchableOpacity>
</>
Result
| Component | Prop | Android 17 | iOS 27 |
|---|---|---|---|
TouchableOpacity | role="button" | android.view.ViewGroup | No Button trait |
TouchableWithoutFeedback | aria-label="Close I" | content-desc="×" (the child) | Label "×" |
TouchableHighlight | aria-checked | checkable="false" | No "checked" in the value |
With the accessibility* form each of them is right: android.widget.Button
and the Button trait, the label "Close J", checked="true".
TouchableNativeFeedbackdropsroletoo (read from the code, not run).aria-labelledbyis dropped by all four (read from the code).Pressabledoes not have these gaps: it passes its props on to aView.
Upstream
- react/react-native#59378
passes
rolefrom all four and maps the missingaria-*; open on 27 October 2026. - react/react-native#58173
passes
aria-labelledbythroughButtonandTouchable*; open on 27 October 2026.