Skip to main content

Common Examples

Pass a visible label and control selection with isSelected and onChange. Use defaultSelected instead for uncontrolled selection. The kit forbids children.
isIndeterminate renders the mixed state a select-all control needs. It is presentation only — a press still resolves to the opposite of isSelected, so the caller decides what selecting “all” means.
Omit label for an indicator-only row — where a neighbouring cell is the visible name — and supply aria-label. TypeScript enforces it: a checkbox with no label and no aria-label will not compile.
This differs from the web component on purpose. Web takes aria-label or aria-labelledby; the RN kit requires aria-label and treats aria-labelledby as an optional extra.On React Native the two are not alternatives: aria-labelledby (RN’s alias for accessibilityLabelledBy) is Android-only, and iOS has no labelledby concept — VoiceOver reads accessibilityLabel. Accepting aria-labelledby on its own would let a checkbox with no accessible name on iOS pass type-checking.Porting web code that named a checkbox with aria-labelledby alone is therefore a compile error here. That is intentional — the alternative is code that looks correct and is silently unusable for iOS screen-reader users.
Pass both to also associate the checkbox with its labelling element for TalkBack:

Accessibility

  • The control uses accessibilityRole="checkbox", with aria-checked set to true, false, or "mixed" when isIndeterminate is set. It uses aria-checked rather than accessibilityState.checked because the two are aliases on native, but only aria-checked survives react-native-web — without it the role ships with no checked state on web.
  • A visible label is also set as accessibilityLabel; indicator-only rows are named by the required aria-label. aria-labelledby is an Android-only addition and never the name on its own — see the warning above.
  • The whole row is the touch target, with a 40pt minimum — the indicator itself is 24pt, below every mobile platform’s minimum. It is a laid-out minimum rather than hitSlop, so the accessibility frame matches the touch area.
Last modified on September 3, 2026