This documentation is available as Markdown for AI agents and LLMs. See the full Markdown index or append .md to any documentation URL.
PagerView
与 react-native-pager-view 兼容的水平分页视图。
一个与 react-native-pager-view API 兼容的 PagerView 组件。它封装了平台特定的 @expo/ui 原语:在 Android 上使用 Jetpack Compose 的 HorizontalPager,在 iOS 上使用分页式 SwiftUI ScrollView。每个子元素都会成为一个单独的页面,并拉伸以填满分页器。
如果你需要对平台特定的分页行为或修饰器进行更底层的控制,请直接使用原生原语。在 iOS 上,使用 page 样式的 TabView 也会渲染一个水平分页器,并且在你想使用 SwiftUI 内置页面指示器时可能更合适。


安装
If you are installing this in an existing React Native app, make sure to install expo in your project.
如果你需要以下任一功能,可以选择安装 react-native-worklets:
- iOS 上带动画的
setPage。 没有 worklets 时,iOS 的setPage会退回为无动画跳转。Android 无论如何都会有动画。 - 每帧、保持在 UI 线程上的
onPageScroll回调。 当你的onPageScroll处理函数本身就是一个 worklet 时,它会在 UI 线程上每一帧同步运行,而不是切回 JS。没有 worklets 时,回调仍然会触发——只是会在 JS 线程上运行。
从 react-native-pager-view 迁移
通过从 @expo/ui/community/pager-view 导入 PagerView 来更新导入语句:
import PagerView from 'react-native-pager-view'; // 变为: import PagerView from '@expo/ui/community/pager-view';
在切换之前,你应该了解以下变化:
- 不支持
orientation="vertical"、keyboardDismissMode、overdrag和overScrollMode。 - 不提供
usePagerView钩子——请改用ref。 - 在 iOS 上,
onPageScroll和onPageScrollStateChanged仅会在 iOS 18 及以上版本触发。
完整列表请参见平台行为。
基本用法
平台行为
Web 不受支持,在 web 上渲染 PagerView 会在运行时抛出错误。
与上游 react-native-pager-view 的其他差异:
- 不支持
orientation="vertical"、keyboardDismissMode、overdrag和overScrollMode。仅支持水平分页,其余选项会回退到平台分页器的默认值。 - 不提供
usePagerView钩子。请使用PagerView的ref来访问setPage、setPageWithoutAnimation和setScrollEnabled。 setScrollEnabled会触发重新渲染,使新值作为 prop 传递到原生视图。它仍然适用于从非 React 上下文中切换,例如基于 ref 的手势处理器。borderRadius样式在两个平台上都生效。在 Android 上,只有数值才会裁剪分页器。底层的 Compose 宿主会静默忽略字符串值,例如'50%'。
API
import PagerView from '@expo/ui/community/pager-view';
Component
Type: React.Element<PagerViewProps>
A drop-in replacement for react-native-pager-view. Renders a horizontally
paged view backed by Jetpack Compose's HorizontalPager on Android and
SwiftUI on iOS. Each child is treated as a separate page.
ReactNodePages of the pager. Each child is treated as a separate page and
stretched to fill the pager. Each child should have a stable key.
number • Default: 0Index of the page that is initially selected. Read once on mount;
later changes are ignored. To navigate after mount, call
ref.setPage() or ref.setPageWithoutAnimation().
string • Default: 'ltr'Layout direction for paging.
Acceptable values are: 'ltr' | 'rtl'
numberNumber of pages kept off-screen on each side of the visible page.
(event: PagerViewOnPageScrollEvent) => voidFires continuously while a swipe is in progress. The event's position
is the index of the leading visible page; offset is the fractional
progress toward the next page in the [0, 1) range.
Mark this handler with 'worklet' (requires react-native-worklets)
to run it synchronously on the UI thread every frame.
(event: PageScrollStateChangedEvent) => voidFires when the scroll state changes between idle, dragging,
and settling.
(event: PagerViewOnPageSelectedEvent) => voidFires when a page is fully selected. The event's position is the
index of the new page.
Ref<PagerViewRef>Ref handle exposing imperative setPage, setPageWithoutAnimation,
and setScrollEnabled methods.
boolean • Default: trueWhether the user can swipe between pages.
Types
Type: NativeSyntheticEvent<PagerViewOnPageScrollEventData>
Type: Readonly<{
offset: number,
position: number
}>
Type: NativeSyntheticEvent<PagerViewOnPageSelectedEventData>
Type: Readonly<{
position: number
}>
Type: NativeSyntheticEvent<PageScrollStateChangedEventData>
Type: Readonly<{
pageScrollState: 'idle' | 'dragging' | 'settling'
}>