React Native for OpenHarmony 实战:三方库 react-native-popup-dialog 的鸿蒙化适配指南
本文记录把 react-native-popup-dialog(弹窗对话框 + 动画)适配到 HarmonyOS 的完整过程。
它做的事:用 Overlay + Animated 弹出一个可动画的对话框(不依赖 <Modal>),
并自带三种动画(FadeAnimation / ScaleAnimation / SlideAnimation),对话框内容由 Dialog / DialogTitle / DialogContent / DialogFooter / DialogButton 组合。
结论分两层,必须分开说:
- 库的"零件"层面:几乎全部通过。
Positions精确值三条全中、Animation基类的 6 条行为全 PASS
(含useNativeDriver默认true、in()/out()故意抛not implemented yet)、
10 个可运行实体全部可用、3 个动画类的继承断言全中、方法归属的原型/箭头对照也命中。 - 但"整体弹出"没成功。 把
<PopupDialog visible>挂上去之后,渲染时报undefined is not a function,
对话框文本在布局里一次都没出现(P1 相位命中 0/3)。这一层本轮未解决。
本文还记下一个重要的预检事实:createClass 命中 7 处,但 React.createClass( 精确命中是 0 —— 全是 babel 的 _createClass helper。
★★★★★ 一、createClass 的 7 处命中全是误报
预检时 createClass 命中 7 处(Animation.js / FadeAnimation.js / ScaleAnimation.js / SlideAnimation.js / Dialog.js / Overlay.js / PopupDialog.js 各一处,全在第 1 行)。
按经验 createClass 是 React 15.5 就废弃的 API ⇒ 真用了就会崩。但逐条看上下文:
[helper 定义(误报)] Animation.js L1
Object.defineProperty(exports,"__esModule",{value:true});var _createClass=function(){...
[helper 定义(误报)] FadeAnimation.js L1
[helper 定义(误报)] PopupDialog.js L1
…(7 处全是 `var _createClass = function(){…}`)
再精确扫一次:
React.createClass( 命中 = 0
⇒ ⇒ 全部是 babel 把 ES class 编译成 ES5 时注入的 _createClass helper(用来定义 class 方法),
和 React.createClass 完全无关 ✓✓
⇒ 教训(再次印证):
扫"已移除 API"必须扫真实使用形态。
createClass要写成React\.createClass\s*\(才算命中;
裸词createClass会把 babel 的_createClasshelper 全部算进来 —— 7 处假警报。
本轮用的是"带上下文判定"的写法(区分 React.createClass / _createClass = function / _createClass(),
所以没被误导 ✓
★★★★★ 二、Positions 精确值:三条全中
源码(src/constants/Constants.js,98 字节):
export const Positions = {
left: 'flex-start',
right: 'flex-end',
center: 'center',
};
实测:
NOTE | Positions = {"left":"flex-start","right":"flex-end","center":"center"}
PASS | ★★★ Positions.left = flex-start
PASS | ★★★ Positions.right = flex-end
PASS | ★★★ Positions.center = center
PASS | ★★ Positions 的键 | 期望=[center,left,right] | 实际=[center,left,right]
⇒ ⇒ 三条值与三条键全部对上 ✓
⇒ 这是本轮最干净的一组精确判据。
★★★★★ 三、Animation 基类:6 条行为全部通过(含"故意抛错")
源码(src/animations/Animation.js):
export default class Animation {
useNativeDriver: boolean
animate: Animated.Value
constructor({initialValue = 0, useNativeDriver = true}: AnimationConfig = {}) {
this.animate = new Animated.Value(initialValue);
this.useNativeDriver = useNativeDriver;
}
in(onFinished?: Function): void { throw Error('not implemented yet'); }
out(onFinished?: Function): void { throw Error('not implemented yet'); }
}
实测:
NOTE | new Animation() 的 useNativeDriver = true
PASS | ★★★ new Animation() 默认 useNativeDriver = true ← 默认值精确命中
NOTE | animate 是否有 setValue 方法 = function
PASS | ★★ animate 是 Animated.Value(有 setValue)
NOTE | new Animation({useNativeDriver:false, initialValue:5}) 的 useNativeDriver = false
PASS | ★★★ 传 useNativeDriver:false 生效
NOTE | in() 抛出的信息 = not implemented yet
PASS | ★★★ in() 抛 not implemented yet ← 故意抛错命中
NOTE | out() 抛出的信息 = not implemented yet
PASS | ★★★ out() 抛 not implemented yet
⇒ ⇒ 6 条全 PASS ✓✓
其中三条判据的类型各不相同,正好互补:
| 判据类型 | 例子 | 抓什么 |
|---|---|---|
| 默认值 | useNativeDriver === true | 构造函数的默认参数有没有生效 |
| 传参覆盖 | {useNativeDriver: false} ⇒ false | 参数是否真的被采用 |
| 对象能力 | animate 有 setValue | 是不是真的 Animated.Value 实例 |
| 故意抛错 | in() / out() 抛 not implemented yet | 抽象基类的方法有没有被实现 |
⇒ 第四条特别有价值:Animation 是抽象基类,in/out 故意抛错;
子类(Fade/Scale/Slide)才是真正实现的。所以这条判据同时在验证"基类没被动过"。
★★★★★ 四、方法归属:一个完美的原型 / 箭头对照
src/PopupDialog.js 里两种写法同时存在:
// ① 原型方法(会被 React 实例的原型链继承)
createDialog() { … }
updateDialog() { … }
destroyDialog() { … }
renderDialog() { … }
render() { … }
// ② 箭头类字段(只挂在实例上)
handleDismiss = () => { … }
实测:
NOTE | prototype 上缺失的方法 = (无)
PASS | ★★★ 5 个方法在 prototype 上 | 期望=0 | 实际=0
NOTE | handleDismiss 在 prototype 上吗(应为 undefined) = undefined
PASS | ★★★ handleDismiss 不在 prototype 上(它是箭头类字段)
⇒ ⇒ 同一个类里,两种成员归属被一次性验证 ✓✓
⇒ 这就是我这几轮积累的成员归属三档规则的现场演示:
| 写法 | prototype | 实例 | 判据写法 |
|---|---|---|---|
普通方法 x() {} | ✅ 有 | ✅(原型链) | typeof C.prototype.x === 'function' |
constructor 里 bind | ✅ 有 | ✅(own key) | 两边都为 function |
箭头类字段 x = () => {} | ❌ 没有 | ✅(own key) | typeof C.prototype.x === 'undefined' |
★★★★ 五、10 个可运行实体 + 7 个 flow 类型(清单比对)
src/index.js 的具名导出是 19 项,但它们是两类东西:
export {
Dialog, Overlay, DialogButton, DialogContent, DialogTitle, DialogFooter, // 6 个 UI
Animation, FadeAnimation, ScaleAnimation, SlideAnimation, // 4 个动画类
DialogProps, DialogFooterProps, DialogFooterActionList, // 7 个 flow 类型
DialogButtonProps, DialogTitleProps, DialogContentProps, OverlayProps,
};
export default PopupDialog;
实测(用清单比对,而不是数数字):
NOTE | 10 个可运行实体里非 undefined 的个数 = 10
PASS | ★★★ 10 个可运行实体全部非 undefined
期望=[Animation,Dialog,DialogButton,DialogContent,DialogFooter,DialogTitle,
FadeAnimation,Overlay,ScaleAnimation,SlideAnimation]
实际=[…完全相同…]
NOTE | 7 个 flow 类型导出里 undefined 的 =
DialogProps, DialogFooterProps, DialogFooterActionList, DialogButtonProps,
DialogTitleProps, DialogContentProps, OverlayProps ← 全部 7 个都是 undefined
⇒ ⇒ 可运行的 10 个全在;7 个 flow 类型在运行时全部 undefined ✓(这是正常的 —— flow 类型只存在于编译期)✓
这也是"清单比对"这条方法的价值(这几轮我一直想在数量断言上做对):
如果我只断言"具名导出有 19 项",会误以为那 7 个类型也能用;
分开成"可运行清单"与"类型清单"比对,才看清真相 ✓
★★★★ 六、继承断言:3 个动画类都 extends Animation
PASS | ★★★ FadeAnimation.prototype instanceof Animation
PASS | ★★★ ScaleAnimation.prototype instanceof Animation
PASS | ★★★ SlideAnimation.prototype instanceof Animation
⇒ X.prototype instanceof Base 是断言继承最干净的写法 ✓
★★★ 七、一个我必须纠正的假设:4 个组件是函数组件,不是 class
我一开始断言"6 个 UI 组件都是 class(有 prototype.render)":
NOTE | 不是 class 的组件 = DialogButton, DialogContent, DialogTitle, DialogFooter
FAIL | ★★★ 6 个 UI 组件都是 class(有 prototype.render) | 期望=0 | 实际=4
回源码看:
// src/components/DialogButton.js L34
function DialogButton({ … }) { … }
// src/components/DialogTitle.js L32
function DialogTitle({ … }) { … }
// src/components/DialogFooter.js L21
function DialogActionList({ … }) { … }
// src/components/DialogContent.js L15
function DialogContent({ style, children }) { … }
// src/components/Dialog.js → class(有 DIALOG_OPENING / DIALOG_OPENED 常量)
// src/components/Overlay.js L7 → class Overlay extends Component
⇒ ⇒ 4 个函数组件 + 2 个 class ✓
⇒ 教训:一个库里"组件都是 class"这种假设不能凭包龄做(这是 0.18.x 的老包,但内部已经混用了函数组件)。
⇒ 正确做法:断言前先看每个文件的 export default 那一行是 class 还是 function ✓
顺带一个可用的细节:DialogButton / DialogTitle 里有 const isAndroid = Platform.OS === 'android' ⇒ 鸿蒙上取 false ✓ 不影响功能。
★★★ 八、没成功的那一层:<PopupDialog visible> 渲染时报错
把 <PopupDialog visible onDismissed width height> 挂上去、用时间轴切 visible:
P1(visible=true)对话框文本命中 0 / 3
P2(visible=false)残留 0
LogBox: "undefined is not a function"
⇒ ⇒ 对话框一次都没渲染出来 ✗
⇒ 而且 LogBox 报了 undefined is not a function —— 说明内部某处调用了不存在的方法。
最可能的位置(未证实):
PopupDialog.jsL4import Sibling from 'react-native-root-siblings'⇒react-native-root-siblings@3.x的 API 与当前环境是否匹配;Overlay.js里的componentWillReceiveProps(React 19 已移除 ⇒ 该方法不会被调用,但不应该导致undefined is not a function);Animated的某个方法在 RNOH 上的差异。
⚠️ 我没有定位到根因,所以本文不把它写成"库有 bug" ——
只写"在这个基线上,<PopupDialog> 的渲染路径会抛 undefined is not a function,对话框未能显示,根因未查明"。
⇒ 但"零件层面"的 25 条判据全部有效:Positions、Animation 基类、继承、方法归属、导出清单都不依赖那条渲染路径 ✓
★★ 九、其余预检结论
| 预检项 | 结果 |
|---|---|
| 老写法九项 | ⚠️ createClass 7 处全是 _createClass helper(误报);componentWillReceiveProps 1 处(Overlay.js,React 19 下不执行);其余空 |
ListView / ViewPropTypes / Text.propTypes / measure / onLayout / NativeModules | ✅ 全空 |
<Modal> / FlatList | ✅ 空 ⇒ 不用 Modal,用 Overlay + Animated |
Platform.OS 4 处 | isAndroid = Platform.OS === 'android' ⇒ 鸿蒙取 false ✓ |
useNativeDriver 29 处 | ⚠️ 多,但 Animation 基类默认 true(实测) |
dependencies | ⚠️ react-native-root-siblings(必须显式装);prop-types(已有);babel-plugin-flow-react-proptypes(babel 插件,不用装) |
peerDependencies | ✅ 只有 react-native >= 0.50 |
scripts.prepare | ✅ 空 |
| 交付包 | src/(14 文件)+ dist/(编译产物)+ .github/*.gif(演示动画,约 4 MB) |



十、接入与预检(要点)
npm install "git+https://atomgit.com/oh-react-native/react-native-popup-dialog.git#0.18.3-ohos-1.0.0" --ignore-scripts
# ★ 必须显式装它的运行时依赖(file: 接入不会自动装)
npm install --ignore-scripts react-native-root-siblings@^3.2.1
# babel-plugin-flow-react-proptypes 是 babel 插件,不需要装
十一、交付包质量与基线说明
| 类别 | 结果 |
|---|---|
| 交付包内容 | src/(14 个 js)+ dist/(编译产物,index.js 含具名导出 ✓)+ .github/*.gif(约 4 MB 演示) |
spec.json | ⚠️ 缺 upstreamCommit |
validation | ⚠️ "build-pass-device-pending" |
| ⚠️ 声明的基线 | reactNative: "0.88.0" + rnoh: "0.84.4" ⇒ 两字段自相矛盾 |
| 备注 | 库代码零改动 |
关于基线:本次验证在 RN 0.84.1 + RNOH 0.84.3 上完成。
⚠️ <PopupDialog> 整体弹出这条路径在本基线上未走通(见第八节)⇒ 渲染路径的结论只对本基线成立;
零件层面(Positions / Animation / 继承 / 方法归属 / 导出清单)的 25 条判据跨基线成立 ✓
十二、已知限制与本次验证边界
12.1 用这个库要知道的
| 事项 | 说明 |
|---|---|
★★★★★ createClass 命中是误报 | 7 处全是 babel 的 _createClass helper;React.createClass( 精确命中 0 |
★★★★★ Positions = {left:'flex-start', right:'flex-end', center:'center'} | 三个值可直接用 |
★★★★★ Animation 是抽象基类 | useNativeDriver 默认 true;in() / out() 故意抛 not implemented yet ⇒ 要用子类 |
★★★★ FadeAnimation / ScaleAnimation / SlideAnimation 都 extends Animation | 继承关系实测成立 |
★★★★ PopupDialog 的方法归属混合 | 原型方法:createDialog / updateDialog / destroyDialog / renderDialog / render;箭头类字段:handleDismiss |
| ★★★★ 4 个组件是函数组件 | DialogButton / DialogTitle / DialogFooter(DialogActionList)/ DialogContent;只有 Dialog / Overlay 是 class |
★★★ 7 个 flow 类型导出运行时全部 undefined | DialogProps / DialogFooterProps / DialogFooterActionList / DialogButtonProps / DialogTitleProps / DialogContentProps / OverlayProps |
⚠️ <PopupDialog visible> 在本基线上渲染报 undefined is not a function | 对话框未能显示,根因未查明 |
★★ 必须装 react-native-root-siblings | PopupDialog.js 直接 import 它 |
★ babel-plugin-flow-react-proptypes 不用装 | 它是 babel 插件,不是运行时依赖 |
★ Overlay.js 有 componentWillReceiveProps | React 19 下该方法不会被调用 ⇒ 那条更新逻辑失效 |
12.2 本次验证的边界
- ★★★
<PopupDialog>整体弹出未走通(渲染报undefined is not a function,对话框文本一次未出现); - ★★★ 未验证
FadeAnimation/ScaleAnimation/SlideAnimation的实际动画效果(只验证了继承关系); - ★★★ 未验证
Dialog/DialogTitle/DialogContent/DialogFooter/DialogButton的组合渲染; - ★★ 未验证
onDismissed回调; - ★★ 未验证
width/height/position(Positions)的实际布局效果; - 未验证
Dialog的BackHandler返回键逻辑; - 未验证
react-native-root-siblings的兄弟节点挂载在 RNOH 上的行为; - 未在
RN 0.88.0/RNOH 0.84.4上复验; - 未测其它屏幕宽度;未做跨平台对照。
库代码未改动。
十三、常见问题
Q1:它在 RN 0.84 上能跑吗?
分两层:
- 零件层面:能。
Positions三条精确值全中、Animation基类 6 条行为全 PASS、3 个动画类继承成立、
10 个可运行实体全部可用、方法归属对照命中。 - 整体弹出:本基线未走通。
<PopupDialog visible>渲染时报undefined is not a function,对话框文本一次都没出现。
Q2:createClass 命中 7 处,是不是不兼容?
不是。 React.createClass( 的精确命中是 0;那 7 处全是 var _createClass = function(){…}(babel 编译 class 用的 helper)。
扫描时要写成 React\.createClass\s*\( 才算命中,裸词会全被 helper 骗到。
Q3:new Animation() 为什么一调用 in() 就抛错?
因为 Animation 是抽象基类:
in(onFinished) { throw Error('not implemented yet'); }
out(onFinished) { throw Error('not implemented yet'); }
要用子类:FadeAnimation / ScaleAnimation / SlideAnimation(都 extends Animation)。
Q4:DialogButton / DialogTitle 用 typeof === 'function' 判断得了吗?
能,但它们没有 prototype.render —— 它们是函数组件(function DialogButton({…})),
不是 class。所以:
typeof DialogButton === 'function'; // true
typeof DialogButton.prototype.render; // undefined ← 别指望有
只有 Dialog 和 Overlay 是 class。
Q5:7 个 *Props 导出是 undefined,正常吗?
正常 —— 它们是 flow 类型(DialogProps / DialogFooterProps / …),只存在于编译期。
运行时用不到它们;如果你在 JS 里 import {DialogProps} 会拿到 undefined。
Q6:必须装什么?
npm install --ignore-scripts react-native-root-siblings@^3.2.1
(PopupDialog.js 直接 import 它。babel-plugin-flow-react-proptypes 是 babel 插件,不用装。)
Q7:Positions 从哪导?
它不在 src/index.js 的具名导出清单里,要从子路径拿:
import {Positions} from 'react-native-popup-dialog/dist/constants/Constants';
// {left:'flex-start', right:'flex-end', center:'center'}
小结
react-native-popup-dialog 是用 Overlay + Animated 实现的弹窗对话框(不依赖 <Modal>),
自带 Fade / Scale / Slide 三种动画。
这一轮的结论必须分两层说,因为两层的结果不一样:
零件层面(25 条判据全 PASS)
Positions三条精确值全中:
{left:'flex-start', right:'flex-end', center:'center'}✓Animation基类 6 条行为全 PASS,其中两条最有价值:- 默认值:
new Animation()的useNativeDriver默认true✓ - 故意抛错:
in()/out()抛not implemented yet✓(证明抽象基类没被动过)
- 默认值:
- 继承断言全中:
Fade/Scale/Slide.prototype instanceof Animation✓ - 方法归属的"原型 / 箭头"对照在一个类里被一次性验证:
createDialog/updateDialog/destroyDialog/renderDialog/render在prototype上;
handleDismiss(箭头类字段)不在prototype上 ✓ - 10 个可运行实体全部非 undefined(清单比对)✓;7 个 flow 类型运行时全
undefined(正常)✓
整体弹出层面(未走通)
6. <PopupDialog visible> 渲染时报 undefined is not a function,对话框文本一次未出现。
根因未查明 ⇒ 本文只写"本基线未走通",不写成"库有 bug" ✓
方法论收获
7. createClass 的 7 处命中全是 babel 的 _createClass helper —— React.createClass( 精确命中 0。
⇒ 再一次印证:扫"已移除 API"必须扫真实使用形态(这条规则已经救过好几次)。
8. "清单比对"替代"数量断言"确实更稳:本轮把 19 个具名导出拆成"10 个可运行 + 7 个类型"两张清单,
数量对不上、名字对不上都会被抓住,而且顺手发现了 flow 类型在运行时是 undefined 这个事实 ✓
9. 我这次又栽在一个"假设"上:断言"6 个 UI 组件都是 class" ⇒ 实际 4 个是函数组件。
⇒ 一个包里可以混用 class 与函数组件,必须逐个看 export default 那一行。
本篇用到的库
| 项 | 内容 |
|---|---|
| 三方库 | react-native-popup-dialog(上游 0.18.3 的鸿蒙适配版) |
| 适配仓库 | https://atomgit.com/oh-react-native/react-native-popup-dialog |
| 适配 TAG | 0.18.3-ohos-1.0.0 |
| 需要 HAR / 权限 / ohpm | 都不需要(纯 JS) |
| 库类型 | 弹窗对话框 + 三种动画(Overlay + Animated,不用 Modal) |
| 运行时依赖 | ⚠️ react-native-root-siblings 必须显式装;prop-types(已有) |
| 不需要装 | babel-plugin-flow-react-proptypes(babel 插件) |
| 导出形态 | 默认导出 PopupDialog(class);具名 19 项(10 个可运行 + 7 个 flow 类型) |
| ⚠️ 本基线问题 | <PopupDialog visible> 渲染报 undefined is not a function,对话框未能显示 |
| 许可证 | MIT |
| 上游仓库 | https://github.com/jacklam718/react-native-popup-dialog |
| 宿主工程 | RNOH084Demo(测试页 rnAppKey = PopupDialogTestApp) |
npm install "git+https://atomgit.com/oh-react-native/react-native-popup-dialog.git#0.18.3-ohos-1.0.0" --ignore-scripts
npm install --ignore-scripts react-native-root-siblings@^3.2.1
import PopupDialog, {
Dialog, Overlay, DialogButton, DialogContent, DialogTitle, DialogFooter,
Animation, FadeAnimation, ScaleAnimation, SlideAnimation,
} from 'react-native-popup-dialog';
// Positions 不在入口具名清单里,要从子路径拿
import {Positions} from 'react-native-popup-dialog/dist/constants/Constants';
// Positions = {left:'flex-start', right:'flex-end', center:'center'}
<PopupDialog visible={visible} onDismissed={() => {}} width={0.85} height={0.3}>
<View>
<DialogTitle title="标题" />
<DialogContent><Text>内容</Text></DialogContent>
<DialogFooter>
<DialogButton text="确定" onPress={() => {}} />
</DialogFooter>
</View>
</PopupDialog>
// ★ Animation 是抽象基类:in()/out() 故意抛 'not implemented yet'
// 用子类:new FadeAnimation() / new ScaleAnimation() / new SlideAnimation()
// useNativeDriver 默认 true
const anim = new Animation();
anim.useNativeDriver; // true(默认值)
anim.in(); // ✗ 抛 Error('not implemented yet')
// ⚠️ 本基线上 <PopupDialog visible> 渲染会报 undefined is not a function(未查明)
// ⚠️ 7 个 flow 类型导出(DialogProps 等)运行时是 undefined —— 正常
// ⚠️ 4 个组件是函数组件(DialogButton/DialogTitle/DialogFooter/DialogContent),无 prototype.render
// ⚠️ createClass 的 7 处命中全是 babel 的 _createClass helper(React.createClass 命中 0)
// ⚠️ Overlay.js 有 componentWillReceiveProps(React 19 下不执行)
# 换页启动测试页 —— force-stop 不能省
hdc shell aa force-stop com.rnoh084.demo
hdc shell aa start -b com.rnoh084.demo -a EntryAbility --ps rnAppKey PopupDialogTestApp
判据的复现方式
# ① 零件层面 25 条判据
hdc shell "hilog -x | grep ppd-test" | Select-String 'PASS|FAIL|SUMMARY|NOTE'
# ⇒ Positions 三值全中;Animation 默认 useNativeDriver=true;in()/out() 抛 not implemented yet
# ⇒ 10 个可运行实体全非 undefined;7 个 flow 类型全 undefined
# ⇒ handleDismiss 不在 prototype 上
# ② 整体弹出(本基线未走通)
devecocli ui layout | Select-String 'PPD 对话框标题' # ⇒ 命中 0
验证环境
| 项 | 版本 |
|---|---|
| React Native | 0.84.1 |
| React | 19.2.3 |
| RNOH(npm / ohpm) | @react-native-oh/react-native-harmony / @rnoh/react-native-openharmony 0.84.3 |
| Node.js / npm | v24.14.0 / 11.9.0 |
| DevEco Studio | 26.0.0.621 |
| HarmonyOS SDK | API 26(26.0.0.32) |
| 设备 | HarmonyOS 7.0.0(26.0.0) Beta2 模拟器 Pura X View(ohos-x64),1320×2232,density 3 |
| 本机状态栏高度 | 117px = 39vp |
| 宿主依赖 | ⚠️ 补装 react-native-root-siblings |
| 宿主 HAP 产物 | entry-default-signed.hap |
| 本次构建 | assembleHap 3 分 37 秒 ⇒ 一次成功(打包与构建退出码都检查了) |
| 验证规模 | 25 PASS / 1 FAIL(FAIL 是我假设"6 个组件都是 class",实际 4 个是函数组件);Positions 三值全中;Animation 6 条行为全 PASS;继承 3/3;清单比对命中;<PopupDialog> 整体弹出未走通(undefined is not a function);4 张截图互异 |
⚠️ 基线说明:交付包
spec.json声明RN 0.88.0 + RNOH 0.84.4(两字段自相矛盾),本次验证在RN 0.84.1 + RNOH 0.84.3上完成。
零件层面判据跨基线成立;整体渲染路径的结论只对本基线成立(未走通)。
相关社区与项目地址
| 项目 | 地址 |
|---|---|
| React Native 鸿蒙官方社区(CPF-RN) | https://atomgit.com/CPF-RN |
| RNOH 框架仓库 | https://atomgit.com/openharmony-RN/ohos_react_native |
| RNOH 三方库使用文档 | https://atomgit.com/OpenHarmony-RN/usage-docs |
| React Native for OpenHarmony 组织 | https://atomgit.com/oh-react-native |
| RN 三方库鸿蒙适配清单 | https://atomgit.com/oh-react-native/rn-ohos-adaptation-overview |
欢迎加入 CPF-RN 鸿蒙社区:https://atomgit.com/CPF-RN
React Native for OpenHarmony 组织:https://atomgit.com/oh-react-native
RN 三方库鸿蒙适配清单:https://atomgit.com/oh-react-native/rn-ohos-adaptation-overview
更多推荐



所有评论(0)