How to build an accessible PullToRefresh in React

The gesture is a touch-only enhancement: it arms only at scrollTop 0 and uses touch-action/overscroll containment so normal scrolling and keyboard use are unaffected. A polite aria-live status region announces the pull, release, and refreshing states (strings from the i18n catalog), and the Spinner exposes role="status" while loading. Because pull-to-refresh cannot be performed without a pointer, apps should also offer an explicit refresh control for keyboard users.

When to use a PullToRefresh

When not to use it

Accessibility

Role status, verified at WCAG 2.2-AA.

Common mistakes

Avoid: Wrapping a non-scrolling element and relying on pull as the only refresh path

Prefer: Wrap the scroll container and also expose a Refresh control for non-touch users

Pull-to-refresh is touch-only; keyboard and pointer users need an explicit control

Example

<PullToRefresh onRefresh={() => refetch()}>
  <FeedList items={items} />
</PullToRefresh>

See the full PullToRefresh reference →