Which aria-* Props Reach the Native Side in React Native 0.88
Every core component accepts role and the aria-* props in its types, but in
React Native 0.88 several components drop some of them without a warning, while
the accessibility* form of the same prop works.
- Checked: 21–23 October 2026
- Versions: React Native 0.88.0
- Devices: iPhone, iOS 27; Samsung phone, Android 16; iOS 27.0 Simulator; Android 17 emulator
- Upstream: react/react-native#59377 and more
How It Was Checked
- The source of every component exported from
react-nativewas read onmain(October 2026) for the props it passes to the native view; the device checks used 0.88.0. Not covered: the deprecated components,SafeAreaView,InputAccessoryView,VirtualView. - The rows users hit were run in pairs, the
aria-*prop next to itsaccessibility*form: on the Simulator and the emulator in the reproducer, read with Accessibility Inspector anduiautomator dump;ViewandTextwith VoiceOver and TalkBack on phones in Memo Lab.
Result
How a prop gets to the native side: each JS component converts aria-* to
accessibility* itself (View, Text, TextInput, Image). The native side
reads only the accessibility* names and role, so a prop the component does
not convert is dropped.
| Component | Dropped | Checked |
|---|---|---|
View | aria-modal | iPhone |
View | aria-live works, but a View with only layout styles is flattened | Android |
Text | aria-live | Android |
Switch, ScrollView, ActivityIndicator | Every aria-*, id, tabIndex; role works (read from the code) | Both |
TouchableOpacity, TouchableNativeFeedback | role, aria-labelledby | Both |
TouchableHighlight | role, aria-labelledby, aria-busy, -checked, -disabled, … | Both |
TouchableWithoutFeedback | role, aria-label, aria-labelledby | Both |
Text | aria-labelledby, aria-modal, aria-value* | Code only |
TextInput, Image | aria-live, aria-modal, aria-value* | Code only |
RefreshControl, Modal | Every aria-*, id, tabIndex | Code only |
Pressable,Button,KeyboardAvoidingView,ImageBackgroundand the lists render aView,ScrollVieworImageand have the same gaps.- Not every gap matters:
aria-modalon anImageoraria-liveon aSwitchmake no sense. The ones that do:aria-labelonSwitch,roleonTouchable*,aria-labelonTouchableWithoutFeedback. aria-labelledbyis a space-separated list of ids on the web;Viewsplits it by commas,TextInputandImagepass it as one id, and Android uses only the first one. A web-stylearia-labelledby="title hint"matches nothing.- What works instead: the
accessibility*form (accessibilityLabel,accessibilityRole,accessibilityState,accessibilityLiveRegion,accessibilityViewIsModal). Two exceptions: a live region on aViewalso needscollapsable={false}, andActivityIndicatoron iOS ignores evenaccessibilityLabel.
Upstream
- react/react-native#59377: the issue with the whole table.
- Landed in
main, not in a release on 27 October 2026: #59328 (aria-modalonView), #59330 (aria-liveonText), #59335 (aViewlive region). - Open on 27 October 2026:
#59378 (
Touchable*), #59379 (Switch,ScrollView,ActivityIndicator), #59072 (aria-hiddenonScrollViewandActivityIndicator), #58173 (aria-labelledbyonButtonandTouchable*); #59380 and its fix #59381 (ActivityIndicatorlabel on iOS).