{"_id":"@bingtang-rn/react-native-popable","_rev":"2-b3879b6ffbe706cbad64684d04d400af","name":"@bingtang-rn/react-native-popable","dist-tags":{"latest":"0.4.4"},"versions":{"0.4.3":{"name":"@bingtang-rn/react-native-popable","version":"0.4.3","keywords":["react-native","harmony","harmonyos","react-native-popable"],"license":"MIT","_id":"@bingtang-rn/react-native-popable@0.4.3","maintainers":[{"name":"luyizouyuan","email":"189605613@qq.com"}],"homepage":"https://gitcode.com/rn_ohos_plugin/react_native_popable","dist":{"shasum":"4ec1343574b192da3b727a838f668bd3ed24cb44","tarball":"https://registry.npmjs.org/@bingtang-rn/react-native-popable/-/react-native-popable-0.4.3.tgz","fileCount":17,"integrity":"sha512-t+MjH81LqbdOvh2z5GE2tBqXqAW4kcJNMUblL4mKaWiAmz95EFVsufmeCG3NeMDbZj7O9SUAAjhWzr1c3YVIxw==","signatures":[{"sig":"MEQCIFTSdlLZq0WyF25A26R1LFOqVZyY6FFDpa/6aE7knuHNAiBr1n3YyOrqoeorln/wK2mNJU5unCzWgxxcnilqJTfypA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":28210},"main":"src/index.tsx","types":"src/index.tsx","module":"src/index.tsx","engines":{"node":">=18"},"gitHead":"15d000e0f0f65fd6c0a32b8502cb480fd9dbc8f7","harmony":{"alias":"react-native-popable"},"private":false,"_npmUser":{"name":"luyizouyuan","email":"189605613@qq.com"},"repository":{"url":"https://gitcode.com/rn_ohos_plugin/react_native_popable","type":"git"},"_npmVersion":"11.12.1","description":"适配鸿蒙版本，提供react_native_popable组件。","directories":{},"_nodeVersion":"24.15.0","react-native":"src/index.tsx","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.6.3","metro":"^0.81.0","react":"18.2.0","typescript":"5.0.4","@types/react":"18.2.79","react-native":"0.72.5","@react-native/typescript-config":"0.79.5","@react-native-oh/react-native-harmony-cli":"^0.77.50"},"peerDependencies":{"react-native":">=0.72"},"_npmOperationalInternal":{"tmp":"tmp/react-native-popable_0.4.3_1785417671279_0.11693879359557235","host":"s3://npm-registry-packages-npm-production"}},"0.4.4":{"_id":"@bingtang-rn/react-native-popable@0.4.4","dist":{"shasum":"1f151a9e6baec630b6876736421a3150da3861be","tarball":"https://registry.npmjs.org/@bingtang-rn/react-native-popable/-/react-native-popable-0.4.4.tgz","fileCount":17,"integrity":"sha512-2qLuO46DtbdNlqCD8xzhS3n8huQm33dHYrfYnPeiECX0f6kAGhwJA6jopGFOjYE+5ttsd9vesMz7XzWWe+RJpg==","signatures":[{"sig":"MEYCIQDRUhReEVyoNKLrp2W4jHStpEhJHhX5Xg5M/mRHd3XhTAIhALvmbrzIweMxwmtN+5ApgBvFDCMQ9xBo6OS2/GUAhumT","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIFkAEMte/OhnBt/mBIgZ+rx6x+ZoXEV1fbZJNnGvHj0YAiEAt5F/HGXOcrR9bav1wiP1znFsU5iiYjagQtgS7ZAs7JM="}],"unpackedSize":28468},"main":"src/index.tsx","name":"@bingtang-rn/react-native-popable","_from":"file:bingtang-rn-react-native-popable-0.4.4.tgz","types":"src/index.tsx","module":"src/index.tsx","engines":{"node":">=18"},"harmony":{"alias":"react-native-popable"},"license":"MIT","private":false,"version":"0.4.4","_npmUser":{"name":"luyizouyuan","email":"189605613@qq.com"},"homepage":"https://gitcode.com/rn_ohos_plugin/react_native_popable","keywords":["react-native","harmony","harmonyos","react-native-popable"],"_resolved":"D:\\code\\rn\\npm\\batch\\react_native_popable\\bingtang-rn-react-native-popable-0.4.4.tgz","_integrity":"sha512-2qLuO46DtbdNlqCD8xzhS3n8huQm33dHYrfYnPeiECX0f6kAGhwJA6jopGFOjYE+5ttsd9vesMz7XzWWe+RJpg==","repository":{"url":"https://gitcode.com/rn_ohos_plugin/react_native_popable","type":"git"},"_npmVersion":"11.12.1","description":"适配鸿蒙版本，提供react_native_popable组件。","directories":{},"maintainers":[{"name":"luyizouyuan","email":"189605613@qq.com"}],"_nodeVersion":"24.15.0","react-native":"src/index.tsx","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.6.3","metro":"^0.81.0","react":"18.2.0","typescript":"5.0.4","@types/react":"18.2.79","react-native":"0.72.5","@react-native/typescript-config":"0.79.5","@react-native-oh/react-native-harmony-cli":"^0.77.50"},"peerDependencies":{"react-native":">=0.72"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/react-native-popable_0.4.4_1790569499383_0.2122257266738159"}}},"time":{"created":"2026-07-30T13:21:10.881Z","modified":"2026-09-28T04:24:59.650Z","0.4.3":"2026-07-30T13:21:11.450Z","0.4.4":"2026-09-28T04:24:59.468Z"},"license":"MIT","homepage":"https://gitcode.com/rn_ohos_plugin/react_native_popable","keywords":["react-native","harmony","harmonyos","react-native-popable"],"repository":{"url":"https://gitcode.com/rn_ohos_plugin/react_native_popable","type":"git"},"description":"适配鸿蒙版本，提供react_native_popable组件。","maintainers":[{"name":"luyizouyuan","email":"189605613@qq.com"}],"readme":"# @bingtang-rn/react-native-popable for HarmonyOS\r\n\r\n本项目基于 [react-native-popable](https://github.com/eveningkid/react-native-popable) 开发，为 React Native 鸿蒙（OpenHarmony）适配版本。如果在使用过程中有任何问题，可以在GitCode提Issue，会及时跟进。issue地址：[issues](https://gitcode.com/rn_ohos_plugin/react_native_popable/issues)。\r\n\r\n## 版本对应关系\r\n\r\n| 鸿蒙适配包版本 | 原始库版本 | 支持 RN 版本 | Autolink | 编译 API 版本 |\r\n| ------------ | ---------- | ------------ | -------- | ------------- |\r\n| 见发布记录 | 0.4.3 | 0.72+ | 否（js-only） | API17+ |\r\n\r\n## 安装\r\n\r\n```bash\r\nnpm install @bingtang-rn/react-native-popable\r\n```\r\n\r\n## 使用\r\n\r\n```tsx\r\nimport { Popable, usePopable, Popover } from 'react-native-popable';\r\n\r\n// Basic usage\r\n<Popable content=\"Hello!\">\r\n  <Button title=\"Press me\" />\r\n</Popable>\r\n\r\n// Imperative control\r\nconst { ref, show, hide } = usePopable();\r\n<Popable ref={ref} content=\"Tooltip\">\r\n  <Button title=\"Target\" />\r\n</Popable>\r\n<Button title=\"Show\" onPress={show} />\r\n<Button title=\"Hide\" onPress={hide} />\r\n```\r\n\r\n> import 时使用原库名 `'react-native-popable'`，而非鸿蒙包名。\r\n\r\n**平台差异**：\r\n- `action='hover'` 在 HarmonyOS 上回退为 `press` 行为（与 Android/iOS 一致），因 ArkUI 无 hover 事件\r\n- Modal 在 RNOH 映射为 ArkUI CustomDialog，路由跳转时不会自动关闭，需 JS 层主动处理\r\n\r\n**权限要求**：\r\n- 无\r\n\r\n## Link\r\n\r\n| 版本 | 是否支持 Autolink |\r\n|------|------------------|\r\n| 当前版本 | 否（js-only，无需原生注册） |\r\n\r\n如使用版本支持 Autolink 且工程已接入，可跳过手动配置。\r\n\r\n<details>\r\n<summary>Manual Link 配置</summary>\r\n\r\n> **说明**：本模块需要同时在 C++ 侧和 ETS 侧注册 Package。\r\n\r\n### 1. Overrides RN SDK\r\n\r\n在工程根目录 `oh-package.json5` 添加：\r\n\r\n```json\r\n{\r\n  \"overrides\": {\r\n    \"@rnoh/react-native-openharmony\": \"./react_native_openharmony\"\r\n  }\r\n}\r\n```\r\n\r\n### 2. 引入原生端依赖\r\n\r\n打开 `entry/oh-package.json5`，添加：\r\n\r\n```json\r\n\"dependencies\": {\r\n  \"@bingtang-rn/react-native-popable\": \"file:../../node_modules/@bingtang-rn/react-native-popable/harmony/popable.har\"\r\n}\r\n```\r\n\r\n执行 `ohpm install`。\r\n\r\n### 3. 配置 CMakeLists\r\n\r\n打开 `entry/src/main/cpp/CMakeLists.txt`，添加：\r\n\r\n```cmake\r\nset(OH_MODULES \"${CMAKE_CURRENT_SOURCE_DIR}/../../../oh_modules\")\r\n\r\nadd_subdirectory(\"${OH_MODULES}/@bingtang-rn/react-native-popable/src/main/cpp\" ./popable)\r\n\r\ntarget_link_libraries(rnoh_app PUBLIC popable)\r\n```\r\n\r\n### 4. 注册 Package（C++ 侧）\r\n\r\n打开 `entry/src/main/cpp/PackageProvider.cpp`，添加：\r\n\r\n```cpp\r\n#include \"PopablePackage.h\"\r\n\r\nstd::vector<std::shared_ptr<Package>> PackageProvider::getPackages(Package::Context ctx) {\r\n    return {\r\n        std::make_shared<PopablePackage>(ctx),\r\n    };\r\n}\r\n```\r\n\r\n### 5. 注册 Package（ETS 侧）\r\n\r\n打开 `entry/src/main/ets/RNPackagesFactory.ets`，添加：\r\n\r\n```typescript\r\nimport { PopablePackage } from '@bingtang-rn/react-native-popable/ts';\r\n\r\nexport function createRNPackages(ctx: RNPackageContext): RNPackage[] {\r\n  return [\r\n    new PopablePackage(ctx),\r\n  ];\r\n}\r\n```\r\n\r\n</details>\r\n\r\n## 属性 / API\r\n\r\n| API | 描述 | 参数 | 返回值 | HarmonyOS 支持 |\r\n|-----|------|------|--------|----------------|\r\n| Popable | 弹出气泡封装组件 | action, animated, animationType, backgroundColor, caret, caretPosition, children, content, numberOfLines, onAction, position, strictPosition, style, visible, wrapperStyle | — | ✅ 完全支持 |\r\n| Popable.show() | 命令式显示 | — | void | ✅ 完全支持 |\r\n| Popable.hide() | 命令式隐藏 | — | void | ✅ 完全支持 |\r\n| Popover | 气泡 UI 组件 | animated, animationType, backgroundColor, caret, caretPosition, children, forceInitialAnimation, numberOfLines, visible, position, ...ViewProps | — | ✅ 完全支持 |\r\n| usePopable | 命令式管理 Hook | — | { ref, show, hide } | ✅ 完全支持 |\r\n\r\n### 平台差异\r\n- `action='hover'`：HarmonyOS 上回退为 `press`，因 ArkUI 无鼠标 hover 事件\r\n- `Modal`：RNOH 映射为 CustomDialog，路由跳转时需 JS 层主动关闭\r\n\r\n### 使用限制\r\n- `measureInWindow` 在 Fabric 模式下可能存在布局测量时序差异，影响自动位置翻转；`onLayout` 作为补充\r\n\r\n## 快速验证（运行 Example）\r\n\r\n### 前置条件\r\n\r\n| 依赖 | 版本要求 |\r\n|------|----------|\r\n| Node.js | >= 18 |\r\n| DevEco Studio | 5.0+ / 6.0+ |\r\n| HarmonyOS SDK | API 17+ |\r\n\r\n### 运行步骤\r\n\r\n**1. 克隆仓库**\r\n\r\n```bash\r\ngit clone <仓库地址>\r\ncd <仓库目录>\r\n```\r\n\r\n**2. 安装依赖并构建**\r\n\r\n```bash\r\nnpm install --legacy-peer-deps\r\nnpm pack           # 生成 tgz 包（会自动触发 prepare 构建 JS 产物）\r\n```\r\n\r\n**3. 进入 example 目录，安装依赖**\r\n\r\n```bash\r\ncd example\r\nnpm install --legacy-peer-deps\r\n```\r\n\r\n**4. 生成 JS Bundle**\r\n\r\n```bash\r\nnpm run dev\r\n```\r\n\r\n产物：`harmony/entry/src/main/resources/rawfile/bundle.harmony.js`\r\n\r\n**5. 用 DevEco Studio 打开鸿蒙工程**\r\n\r\n- 打开 DevEco Studio\r\n- 选择 `example/harmony` 目录\r\n- 等待 Sync 完成\r\n\r\n**6. 编译并运行 HAP**\r\n\r\n在 DevEco Studio 中点击运行按钮，将 HAP 安装到设备/模拟器。\r\n\r\n> **注意**：Example 中已预置插件依赖和 Package 注册，无需手动配置 Link。\r\n\r\n## 约束与限制\r\n\r\n### 兼容性\r\n\r\n- RNOH: 0.72+\r\n- HarmonyOS SDK: API 17+\r\n- DevEco Studio: 5.0+\r\n\r\n## 遗留问题\r\n\r\n无（或列出已知问题）\r\n\r\n## 开源协议\r\n\r\n本项目基于 [MIT](https://github.com/eveningkid/react-native-popable/blob/main/LICENSE) 协议，详见 [LICENSE](./LICENSE) 文件。\r\n","readmeFilename":"README.md"}