# RnDemos
**Repository Path**: scenario-samples/rn-demos
## Basic Information
- **Project Name**: RnDemos
- **Description**: 【鸿蒙 Harmony Next 示例 代码】本示例是一个RN相关场景的示例,搭建了不同的页面向用户提供不同RN适配鸿蒙的使用场景。用于在应用程序中显示RN页面内容,为开发者提供RN与鸿蒙原生交互、Rn Webview加载本地页面等能力。
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-06-03
- **Last Updated**: 2025-07-02
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# RN相关场景Demo
## 介绍
本示例是一个RN相关场景的示例,搭建了不同的页面向用户提供不同RN适配鸿蒙的使用场景。用于在应用程序中显示RN页面内容,为开发者提供RN与鸿蒙原生交互、Rn Webview加载本地页面等能力。
## 效果预览图
## 运行须知
本示例运行需搭建RN开发环境,请根据文档:https://gitee.com/openharmony-sig/ohos_react_native/blob/0.72.5-ohos-5.0-release/docs/zh-cn/%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA.md 进行环境搭建,否则会导致运行失败;
环境搭建完成后,执行如下操作即可运行本示例:
2. 在RnDemos目录下执行如下命令:
npm install -- 安装rn相关依赖;
2. RN工程安装完依赖后,使用DevEco打开ReDemos/harmony鸿蒙应用工程,并执行sync同步依赖
3. 在RnDemos目录下执行如下命令:
npm run dev -- 生成CodeGen代码和bundle文件
执行完后会在ReDemos/harmony鸿蒙应用工程中生成codegen胶水代码;
## 实现思路
RN桥接原生组件方式
1. 使用CodeGen生成桥接代码。源码参考RnDemos中的MarqueeView.tsx。
```typescript
export type OnStopEventData = Readonly<{
isStop: boolean,
type: string,
}>;
export interface MarqueeViewProps extends ViewProps {
src: string,
onStop?: DirectEventHandler;
}
export default codegenNativeComponent(
'MarqueeView',
) as HostComponent;
```
2. 原生侧实现。`Descriptor`的功能是封装RN侧组件代码传递到ArkUI组件的参数,`MarqueeView`对RN侧公开了一个`src`参数,用于显示跑马灯的滚动内容。原生侧定义`MarqueeViewDescriptor`代码如下。源码可参考harmony下的MarqueeView.ets
```typescript
export interface MarqueeViewProps extends ViewBaseProps {
src: string
}
export type MarqueeViewDescriptor = Descriptor<"MarqueeView", MarqueeViewProps>;
```
3. RN侧使用原生组件页面可以和其他标准组件的创建方式一样,在组件容器内添加`MarqueeView`标签。源码可参考AwesomeProject中的NativeComponent.tsx
```typescript
{
console.log('native调用了RN的 onStop,isStop = ' + e.nativeEvent.isStop);
setMarqueeStop(e.nativeEvent.isStop);
}}
/>
```
两端调用方式(Rn与鸿蒙原生通信)
1. 调用`RNInstance`中的`emitDeviceEvent`,向js侧发送自定义的事件。第一个参数是事件的名称,第二个参数是事件发送的数据。
```typescript
this.ctx.rnInstance.emitDeviceEvent("clickMarqueeEvent", { params: { age: 18 } })
```
2. 在js代码中添加对应事件的监听与处理。
```typescript
DeviceEventEmitter.addListener('clickMarqueeEvent', e => {
// 添加事件处理
});
```
RN webview加载本地H5资源
1. 使用Resource://rawfile文件加载本地页面,同时开启相关参数,以便webview能正常加载css以及js等资源文件。
```typescript
const source = {
uri: 'resource://rawfile/webPage/luckyDraw/index.html', // 确保路径正确
};
```
## 高性能知识点
不涉及
## 工程结构&模块类型
```
RnDemos // RN项目
|---harmony // 鸿蒙原生项目
| |---entry // 鸿蒙原生入口文件
| |---libs // 鸿蒙原生依赖包
|---views // RN页面代码
| |---MainPage.tsx // 主页面
| |---MarqueeView.tsx // CodeGen生成桥接code代码
| |---NativeComponent.tsx // 桥接鸿蒙原生代码
| |---WebViewJsPage.tsx // Web veiw加载本地H5页面代码
|---App.tsx // RN应用入口代码
```
## 模块依赖
RN三方库依赖:https://gitee.com/react-native-oh-library/usage-docs
### 参考资料
[RN环境搭建]: https://gitee.com/openharmony-sig/ohos_react_native/blob/0.72.5-ohos-5.0-release/docs/zh-cn/%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA.md
[自定义组件]: https://gitee.com/openharmony-sig/ohos_react_native/blob/0.72.5-ohos-5.0-release/docs/zh-cn/%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BB%84%E4%BB%B6.md
[两端通信]: https://gitee.com/openharmony-sig/ohos_react_native/blob/0.72.5-ohos-5.0-release/docs/zh-cn/%E4%B8%A4%E7%AB%AF%E9%80%9A%E8%AE%AF.md
## 一份简单的问卷反馈
亲爱的Harmony Next开发者,您好!
为了协助您高效开发,提高鸿蒙场景化示例的质量,希望您在浏览或使用后抽空填写一份简单的问卷,我们将会收集您的宝贵意见进行优化:heart:
[:arrow_right: **点击此处填写问卷** ](https://wj.qq.com/s2/19042938/95ab/)