This documentation is available as Markdown for AI agents and LLMs. See the full Markdown index or append .md to any documentation URL.
BottomSheet
与 @gorhom/bottom-sheet 兼容的底部弹出层。
一个 API 与 @gorhom/bottom-sheet 兼容的 BottomSheet 组件。它封装了平台专属的 @expo/ui 基元:Android 上的 Jetpack Compose ModalBottomSheet,以及 iOS 上的 SwiftUI BottomSheet。在 web 上,它使用 HTML <dialog> 底部弹出面板。
如果你需要更精细地控制平台专属的样式、修饰符或布局行为,请直接使用原生基元。


安装
If you are installing this in an existing React Native app, make sure to install expo in your project.
从 @gorhom/bottom-sheet 迁移
-
将导入语句从:
import BottomSheet, { BottomSheetView } from '@gorhom/bottom-sheet';更新为使用
@expo/ui/community/bottom-sheet:import BottomSheet, { BottomSheetView } from '@expo/ui/community/bottom-sheet'; -
此实现不需要来自
react-native-gesture-handler的GestureHandlerRootView。如果应用的其他部分需要它,可以保留。 -
不支持
BottomSheetBackdrop、BottomSheetHandle、BottomSheetFooter、BottomSheetDraggableView、BottomSheetVirtualizedList、BottomSheetFlashList、useBottomSheetModal、useBottomSheetSpringConfigs和useBottomSheetTimingConfigs等组件与 hook 导出。为了保持 API 兼容性,会导出部分相关属性类型。
基本用法
BottomSheetModal
从 @gorhom/bottom-sheet 的 modal API 迁移时,请使用 BottomSheetModal。它初始处于关闭状态,并通过 present() 打开。
动态尺寸
未提供 snapPoints 时,弹出面板默认会根据内容调整尺寸。请使用 BottomSheetView 作为弹出面板内容的包装组件。
可滚动的 React Native 内容
底部弹出面板支持将 React Native FlatList 或 ScrollView(或 FlashList 或 Legend List 等高性能列表)作为子组件,以显示可滚动内容。启用 nestedScrollEnabled 后,列表会先滚动自身内容。到达顶部边缘后,剩余的拖动操作会移动弹出面板。为了兼容 @gorhom/bottom-sheet,还会导出 BottomSheetFlatList 和 BottomSheetScrollView,但它们只是 React Native 组件的直接重新导出。
平台行为
@gorhom/bottom-sheet 会以内嵌方式显示在其父视图底部。此组件在 Android 和 iOS 上使用原生模态呈现,在 web 上使用 HTML <dialog>。
这是有意为之的差异。@gorhom/bottom-sheet 通过 react-native-gesture-handler 和 react-native-reanimated 管理手势与动画层,而 @expo/ui/community/bottom-sheet 则将这些行为交由 Jetpack Compose、SwiftUI 以及 web 上的 HTML <dialog> 处理。因此,此组件最适合模态底部弹出面板流程,包括使用 BottomSheet API 而非 BottomSheetModal 的调用场景。
在 iOS 上,如果要在一个底部弹出面板上方显示另一个,请将第二个
BottomSheet嵌套在第一个弹出面板的内容中,而不是与其并列。这是底层 SwiftUIsheet修饰符的限制。有关详细信息,请参阅如何呈现多个弹出面板。
支持的导出项
兼容性说明
- 支持
snapPoints、index、onChange、onClose、onDismiss、enablePanDownToClose和enableDynamicSizing。 handleComponent={null}会隐藏原生或 web 拖动指示器。在原生平台上不会渲染自定义手柄组件。backgroundStyle在 web 上完全生效。在 Android 上,backgroundColor用于设置原生容器颜色。在 iOS 上,则使用系统弹出面板背景。- 为保持 API 兼容性,可以接受动画、过度拖动、内容平移、手柄平移、键盘行为、自定义背景遮罩、自定义背景、自定义页脚、动画值和分离式属性,但不会改变行为。
API
import BottomSheet from '@expo/ui/community/bottom-sheet';
Components
Type: React.Element<BottomSheetProps>
Bottom sheet component. Defaults to index={0} and opens at the first snap point on mount.
Props for the BottomSheet component. API-compatible with @gorhom/bottom-sheet where native platform behavior allows.
boolean • Default: trueWhether the sheet should automatically size to fit its content.
boolean • Default: falseWhether the sheet can be dismissed by panning down.
number • Default: 0Initial snap point index. Set to -1 to start closed.
(index: number) => voidCalled when the current snap point index changes.
() => voidAlias for onClose for BottomSheetModal compatibility.
Type: React.Element<BottomSheetProps>
Modal variant of BottomSheet. Starts closed and opens with present().
Type: React.Element<{
children: React.ReactNode
}>
Provider for BottomSheetModal. It renders children directly for API compatibility.
Type: React.Element<BottomSheetViewProps>
A wrapper for content inside a BottomSheet.
boolean • Default: trueWhether the sheet should automatically size to fit its content.
boolean • Default: falseWhether the sheet can be dismissed by panning down.
number • Default: 0Initial snap point index. Set to -1 to start closed.
(index: number) => voidCalled when the current snap point index changes.
() => voidAlias for onClose for BottomSheetModal compatibility.
Hooks
Returns the imperative methods for the nearest BottomSheet.
BottomSheetMethods