前端移动开发UI组件跨平台【免费下载链接】react-native-bottom-sheetA performant interactive bottom sheet with fully configurable options 项目地址https://gitcode.com/gh_mirrors/re/react-native-bottom-sheet点击查看免费下载Bottom Sheet Modal是gorhom/bottom-sheet在Bottom Sheet之上包装/装饰出的模态化组件它继承了底部弹层全部功能并额外提供模态呈现present/dismiss、栈式多弹层管理stack sheet modals等能力。本指南以 v4 版本modal/props.md文档为骨架结合仓库源码系统讲解BottomSheetModal的独有 props——name、stackBehavior、enableDismissOnClose、onDismiss、containerComponent的类型、默认值、底层实现与典型使用场景。读完你将掌握如何为每个模态命名并定向管理、如何通过push/switch/replace三种栈行为编排多弹层、如何在关闭时自动卸载并监听onDismiss以及如何用containerComponent配合FullWindowOverlay把弹层提升到应用最顶层。一、Modal 是什么包装在 Bottom Sheet 之上的呈现层在深入 props 之前先明确Bottom Sheet Modal的定位。根据 modal/index.mdx它是Bottom Sheet的 wrapper/decorator包装/装饰器提供其全部功能并叠加模态呈现能力平滑的挂载mounting动画、以及受 Apple Maps sheet modals 启发的栈式 sheet modal支持。从源码看这一包装关系非常直观在 src/components/bottomSheetModal/BottomSheetModal.tsx 中组件内部维护了一个BottomSheet的 ref并将外层接收到的snapPoints、index、enablePanDownToClose、animateOnMount等透传给内层BottomSheetBottomSheet {...bottomSheetProps} ref{bottomSheetRef} index{index} snapPoints{snapPoints} enablePanDownToClose{enablePanDownToClose} animateOnMount{animateOnMount} containerHeight{containerHeight} containerOffset{containerOffset} onChange{handleBottomSheetOnChange} onClose{handleBottomSheetOnClose} onAnimate{handleBottomSheetOnAnimate} $modal{true} {typeof Content function ? Content data{data} / : Content} /BottomSheet同时BottomSheetModal通过useImperativeHandle暴露了完整的命令式 API——既有继承自 Bottom Sheet 的snapToIndex、snapToPosition、expand、collapse、close、forceClose也有模态专属的dismiss、present详见 modal/methods.md// src/components/bottomSheetModal/BottomSheetModal.tsx useImperativeHandle(ref, () ({ // sheet methods继承自 Bottom Sheet snapToIndex, snapToPosition, expand, collapse, close, forceClose, // modal methods新增 dismiss: handleDismiss, present: handlePresent, // internal供 Provider 栈管理使用 minimize: handleMinimize, restore: handleRestore, }));props 继承关系BottomSheetModal继承Bottom Sheet的全部 propssnapPoints、index、onChange、enablePanDownToClose、自定义 handle/backdrop 等参见 version-4/props.md仅排除animateOnMount与containerHeight这两个由 Modal 内部接管的值containerHeight由 Provider 统一注入animateOnMount在 Modal 语义下不再适用。在此基础上Modal 引入了自己的 5 个专属配置项下面逐一展开。二、Configuration三个行为配置项2.1 name —— 给模态一个可寻址的标识typedefaultrequiredstringgenerated unique keyNOname用于标识模态方便后续定向管理例如配合useBottomSheetModal的dismiss(key)精确关闭指定模态。从源码可以印证它的实现与用途。在 src/components/bottomSheetModal/BottomSheetModal.tsx 中const key useMemo(() name || bottom-sheet-modal-${id()}, [name]);即传入name则以其为 key未传入时自动生成唯一 keyid()定义于 src/utilities/id.ts。这个key同时充当了gorhom/portal的 portal 名称以及 Modal Provider 栈队列sheetsQueueRef中该弹层的索引键从而实现按名定位。实践中建议同一界面若存在多个BottomSheetModal例如评论弹层 分享弹层务必为它们分配不同的name否则栈管理和定向 dismiss 会相互干扰。2.2 stackBehavior —— 定义模态挂载时的栈行为说明文档中标注Available only on v3, for now是历史遗留提示在 v4 中该能力已完整支持。stackBehavior决定当一个新的 Modal 挂载present时当前已呈现的 Modal 该如何处理push—— 将新模态直接挂载到当前模态之上两者都可见形成堆叠switch—— 先将当前模态最小化minimize再挂载新模态默认行为replace—— 先关闭dismiss当前模态再挂载新模态。typedefaultrequiredpush \| switch \| replaceswitchNO源码佐证合法取值定义在 src/constants.ts 的MODAL_STACK_BEHAVIOR常量中默认值switch与类型定义BottomSheetModalStackBehavior位于 src/components/bottomSheetModal/constants.ts 与 types.d.ts。栈行为真正落地在 src/components/bottomSheetModalProvider/BottomSheetModalProvider.tsx 的handleMountSheet中const currentMountedSheet _sheetsQueue[_sheetsQueue.length - 1]; if (currentMountedSheet !currentMountedSheet.willUnmount) { if (stackBehavior MODAL_STACK_BEHAVIOR.replace) { currentMountedSheet.ref?.current?.dismiss(); } else if (stackBehavior MODAL_STACK_BEHAVIOR.switch) { currentMountedSheet.ref?.current?.minimize(); } }可以看到push不触碰当前模态直接入栈switch调用当前模态内部的minimize()通过 BottomSheetModal.tsx 的handleMinimize记录restoreIndexRef后执行close()replace则直接dismiss()当前模态。而当你关闭/收起栈顶模态后Provider 的handleUnmountSheet/handleWillUnmountSheet会自动对栈中前一个被最小化的模态调用restore()恢复其原有位置——这正是栈式体验的关键闭环。典型使用需要二级详情页式体验如地图 App 中列表 → 详情时用replace需要通知堆叠式体验时用push默认的switch则适用于大多数先让位、再登场的场景。2.3 enableDismissOnClose —— 关闭即卸载typedefaultrequiredbooleantrueNO当模态关闭closed时是否将其卸载unmount。默认true即弹层一旦关闭就会从 React 树中移除释放内存与原生视图。源码逻辑位于 BottomSheetModal.tsx 的handleBottomSheetOnCloseconst handleBottomSheetOnClose useCallback(function handleBottomSheetOnClose() { if (minimized.current) return; // 被 switch 最小化时不卸载 if (enableDismissOnClose) { unmount(); } }, [enableDismissOnClose, unmount]);而unmount()会依次重置内部变量 →unmountSheet(key)从 Provider 栈中移除 →unmountPortal(key)销毁 portal → 将mount状态复位setState(INITIAL_STATE)→触发onDismiss回调。设置enableDismissOnClose{false}时弹层关闭后仍保留挂载状态内部currentIndexRef回到-1的关闭位适合希望保留弹层内容状态、避免重复重建的场景但要注意它与onDismiss只在真正卸载时触发的联动差异。三、CallbacksonDismiss —— 卸载时的收尾回调type onDismiss () void;typedefaultrequiredfunctionnullNOonDismiss在模态**被卸载dismissed/unmounted**时触发。注意它与onCloseBottom Sheet 的关闭回调仅表示动画走到关闭位的区别onDismiss语义更重代表模态从视图树中彻底移除。从源码看它是在unmount()的收尾阶段被调用的const unmount useCallback(function unmount() { resetVariables(); unmountSheet(key); unmountPortal(key); if (_mounted) { setState(INITIAL_STATE); } // fire onDismiss callback if (_providedOnDismiss) { _providedOnDismiss(); } }, [key, resetVariables, unmountSheet, unmountPortal, _providedOnDismiss]);典型使用在onDismiss中做数据刷新、埋点统计、或清理依赖模态的临时状态。例如用户在弹层内完成了某项操作后手动下滑关闭此时触发onDismiss通知列表页刷新。四、ComponentscontainerComponent —— 容器定制与 FullWindowOverlaytypedefaultrequiredReact.ReactNodeundefinedNOcontainerComponent用于替换模态的容器组件核心场景是当使用react-native-screens的FullWindowOverlay时将 bottom sheet 放置到应用最顶层从而覆盖其他 Screen 之上的内容对应 gorhom/react-native-bottom-sheet#832 所述问题。源码实现上ContainerComponent被包裹在 portal 内部、BottomSheet之外Portal ... ContainerComponent key{key} BottomSheet ... / /ContainerComponent /Portal文档中表格将该 prop 类型写作React.ReactNode而仓库 types.d.ts 的实际类型定义更精确containerComponent?: React.ComponentTypeReact.PropsWithChildren即应传入一个组件类型如FullWindowOverlay而非一个 JSX 实例。传自定义容器时需注意容器需要接收并正确渲染其children即内部的 BottomSheet并保证布局尺寸正常。在 example/src/screens/integrations/map 中可以看到这类容器定制的实践参考BlurredBackground、LocationDetailsBottomSheet等组件展示了与全屏背景、详情弹层组合的写法。五、组合实战完整可运行的用法示例以下示例继承自 modal/usage.md 并加以扩展演示了 Provider 包裹、ref 声明、present()呈现、onChange监听、以及专属 props 的组合使用import React, { useCallback, useMemo, useRef } from react; import { View, Text, StyleSheet, Button } from react-native; import { BottomSheetModal, BottomSheetModalProvider, BottomSheetModalMethods, } from gorhom/bottom-sheet; const App () { // ref const bottomSheetModalRef useRefBottomSheetModalMethods(null); // variables const snapPoints useMemo(() [25%, 50%], []); // callbacks const handlePresentModalPress useCallback(() { bottomSheetModalRef.current?.present(); }, []); const handleSheetChanges useCallback((index: number) { console.log(handleSheetChanges, index); }, []); const handleOnDismiss useCallback(() { console.log(Modal dismissed unmounted); }, []); // renders return ( BottomSheetModalProvider View style{styles.container} Button onPress{handlePresentModalPress} titlePresent Modal colorblack / BottomSheetModal ref{bottomSheetModalRef} namemain-modal stackBehaviorswitch enableDismissOnClose{true} index{1} snapPoints{snapPoints} onChange{handleSheetChanges} onDismiss{handleOnDismiss} View style{styles.contentContainer} TextAwesome /Text /View /BottomSheetModal /View /BottomSheetModalProvider ); }; const styles StyleSheet.create({ container: { flex: 1, padding: 24, justifyContent: center, backgroundColor: grey, }, contentContainer: { flex: 1, alignItems: center, }, }); export default App;要点回顾必须使用BottomSheetModalProvider包裹Modal 的挂载、栈管理与containerHeight注入都依赖该 Provider见 src/components/bottomSheetModalProvider/BottomSheetModalProvider.tsx调用present()而非直接渲染Modal 初始不挂载mount: false必须通过 ref 调用present()触发挂载与呈现动画present还可接收可选参数data传入弹层内容若 children 是函数组件({ data }) ...则直接接收滚动内容如需在弹层内使用 FlatList / ScrollView / SectionList请改用BottomSheetFlatList、BottomSheetScrollView、BottomSheetSectionList等可滚动组件参见 version-4/scrollables.md以保证手势联动正常。六、配套能力useBottomSheetModal 与命令式 API虽然props.md本身只讲解配置项但要完整使用 Modal 的 props 效果尤其name与stackBehavior离不开两个配套入口这里一并给出依据 modal/hooks.md 与 modal/methods.md。6.1 useBottomSheetModal —— 从任意组件操控模态该 hook 在BottomSheetModalProvider内的任何组件中可用提供模态专属能力Sheet 自身能力请查看 version-4/hooks.mdimport React from react; import { View, Button } from react-native; import { useBottomSheetModal } from gorhom/bottom-sheet; const SheetContent () { const { dismiss, dismissAll } useBottomSheetModal(); return ( View Button titleDismiss onPress{() dismiss(main-modal)} / Button titleDismiss All onPress{dismissAll} / /View ); };dismiss(key?: string)按name/key 定向关闭某个模态不传 key 时关闭最后呈现栈顶的模态dismissAll()关闭并卸载所有已呈现的模态。其底层实现在 BottomSheetModalProvider.tsx 的handleDismiss/handleDismissAll中——前者按name在sheetsQueueRef中查找并调用对应 ref 的dismiss()这也再次印证了nameprop 的价值。6.2 模态专属方法present / dismiss通过 ref 可直接调用除继承自 Bottom Sheet 的 6 个方法外type present ( // Data to be passed to the modal. data?: any ) void; type dismiss ( // AnimationConfigs snap animation configs. animationConfigs?: WithSpringConfig | WithTimingConfig ) void;present(data?)挂载并呈现模态到初始 snap point可选地传入数据dismiss(animationConfigs?)关闭并卸载模态可自定义关闭动画配置支持 Reanimated 的弹簧/时序配置。七、总结五张表速查Prop类型默认值必填作用namestring自动生成唯一 key否标识模态用于定向 dismiss 与栈管理stackBehaviorpush \| switch \| replaceswitch否新模态挂载时对当前模态的处理策略enableDismissOnClosebooleantrue否关闭时是否卸载模态onDismiss() voidnull否模态被卸载时触发的回调containerComponentReact.ComponentTypeReact.PropsWithChildrenundefined否自定义容器典型用于FullWindowOverlay顶层呈现关键源码索引便于继续深入Modal 组件实现src/components/bottomSheetModal/BottomSheetModal.tsxProps 类型与默认值src/components/bottomSheetModal/types.d.ts、src/components/bottomSheetModal/constants.ts栈管理核心src/components/bottomSheetModalProvider/BottomSheetModalProvider.tsx栈行为取值常量src/constants.ts示例应用example/src/screens/modal至此你已经掌握BottomSheetModal全部专属 props 的语义、默认值、源码路径与实战组合方式。在此基础上按需搭配useBottomSheetModal的dismiss/dismissAll、present(data)传参以及BottomSheetFlatList等滚动组件即可构建出接近原生体验、支持多弹层栈编排的完整模态体系。赞分享前端移动开发UI组件跨平台【免费下载链接】react-native-bottom-sheetA performant interactive bottom sheet with fully configurable options 项目地址https://gitcode.com/gh_mirrors/re/react-native-bottom-sheet点击查看免费下载相关推荐react-native-bottom-sheet 组件 Props 全解从吸附点、手势到键盘与动画的完整配置指南react native bottom sheet 组件 Props 全解从吸附点、手势到键盘与动画的完整配置指南 本篇指南以 react native bo前端移动开发UI组件跨平台OpenMetadata Schema-first 机制实战JSON Schema 如何驱动 Pydantic、Java 与 TypeScript 三端代码生成OpenMetadata Schema first 机制实战JSON Schema 如何驱动 Pydantic、Java 与 TypeScript 三端代码生前端移动开发UI组件跨平台OneTBB 中 concurrent_unordered_set 的类模板参数推导CTAD指南从规范到源码实现OneTBB 中 concurrent_unordered_set 的类模板参数推导CTAD指南从规范到源码实现 本文以 Intel oneTBBone前端移动开发UI组件跨平台上一篇[你的MCP服务器名称] 安装指南下一篇.NET Core安装指南多平台部署创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
Keil5选STLink就闪退?驱动更换与DLL替换全解决 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 5:37:28
nanoGPT 手把手教程:3分钟跑通第一个GPT模型,复现GPT-2与微调全流程 nanoGPT 手把手教程:3分钟跑通第一个GPT模型,复现GPT-2与微调全流程 【免费下载链接】nanoGPT The simplest, fastest repository for training/finetuning medium-sized GPTs. 项目地址: https://gitcode.com/GitHub_Trending/na/nanoGPT
nanoGP… · 2026/9/25 5:37:28
马肯依码士9410/9450串口通讯协议与调试避坑指南 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 6:03:00
ax:面向Agentic工作负载的Kubernetes CLI调度编排实战 1. 从“ax”这个标题说起:一个被低估的Agentic调度入口第一次看到“ax”这个标题,很多人会以为是某个命令行工具的缩写,或者某个内部项目的代号。但把热搜词摊开来看——ax、agentic、orchestrator、Kubernetes、CLI——这几个词凑在一起&… · 2026/9/25 6:03:00
FlexGen 单 GPU 高吞吐大模型推理引擎:论文解读与源码实战指南 推理引擎大模型 【免费下载链接】FlexGen Running large language models on a single GPU for throughput-oriented scenarios. 项目地址: https://gitcode.com/gh_mirrors/fl/FlexGen 点击查看 免费下载 本文以 FlexGen 仓库中收录的论文《High-throughput Gener… · 2026/9/25 6:02:54
Miller 分隔符完全指南:记录、字段与键值对分隔符(RS/FS/PS)的配置与实战 CLI数据分析 【免费下载链接】miller Miller is like awk, sed, cut, join, and sort for name-indexed data such as CSV, TSV, and tabular JSON 项目地址: https://gitcode.com/gh_mirrors/mi/miller 点击查看 免费下载 Miller 把文本数据切分为"记录、字段… · 2026/9/25 6:02:54
MikroORM EntityRepository 实战指南:从默认仓储到自定义仓储与类型推断 后端 【免费下载链接】mikro-orm TypeScript ORM for Node.js based on Data Mapper, Unit of Work and Identity Map patterns. Supports MongoDB, MySQL, MariaDB, MS SQL Server, PostgreSQL and SQLite/libSQL databases. 项目地址: https://gitcode.com/gh_mir… · 2026/9/25 6:02:54
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37