HarmonyOS RN模式中TurboModule组件怎么向JS发送事件

HarmonyOS
2024-12-25 08:33:25
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
FengTianYa

具体请参考:js给native发消息 js给native发消息需要⽤到TurboModule模块,它可以通过React Native的「Bridge」帮助JavaScript和原⽣代码进⾏交互,并使⽤跨平台的数据格式JSON进⾏通讯。

下面以Demo中的SampleTurboModule为例,介绍js给Native发消息的流程。

通过TurboModuleRegistry的getEnforcing⽅法在js侧定义TurboModule。注意,代码中必须要输出TurboModuleRegistrySpec对象。

// SampleProject\MainProject\src\bundles\basic\SampleTurboModule.tsx
import { TurboModule, TurboModuleRegistry } from "react-native";
// ⾃定义的TurboModules
export interface SpecSampleTurboModule extends TurboModule {
  pushStringToHarmony(arg: string ,id?: number): string;
  registerFunction(onComplete: (value: string) => void): void;
  doAsyncJob(shouldResolve: boolean): Promise<string>;
  rnLog(info: string): void;
}
export default TurboModuleRegistry.getEnforcing<SpecSampleTurboModule>
('SampleTurboModule');

使⽤Codegen或⾃⾏实现CPP层的胶⽔代码。

generated
├── RNOHGeneratedPackage.h
├── SpecSampleTurboModule.cpp
└── SpecSampleTurboModule.h

在React的代码中引入SampleTurboModule,并调⽤SampleTurboModule暴露的⽅法,如registerFunction⽅法。

import SampleTurboModule from '../basic/SampleTurboModule';
SampleTurboModule.registerFunction((value) => {
  // 代码的实现逻辑
});

实现SampleTurboModule的原⽣侧代码。

import { TurboModule } from '@rnoh/react-native-openharmony/ts';
export interface TurboModuleEventData {
  param: string
}
export class SampleTurboModule extends TurboModule {
  registerFunction(onComplete: (value: string) => void): void {
    console.log(`RNOH SampleTurboModule::registerFunction + trigger`);
    setTimeout(() => {
      onComplete?.('... from native side');
    }, 1000);
  }
  // 其余⽅法的实现
}

native给js发消息DeviceEventEmitter native给js侧发消息,可以通过DeviceEventEmitter发送事件到js侧来实现的。包括两个部分,分别是native侧发送事件,以及js侧监听事件。介绍Native给js发消息的流程。 native侧发送事件 开发者可以通过调⽤RNInstance中的emitDeviceEvent,向js侧发送⾃定义的事件。第⼀个参数是事件的名称,第⼆个参数是事件发送的数据。

// SampleApp\entry\src\main\ets\customView\MarqueeView.ets
this.ctx.rnInstance.emitDeviceEvent("clickMarqueeEvent", { params: { age: 18 } }) 

js侧监听事件 开发者需要在js代码中添加对应事件的监听与处理。

DeviceEventEmitter.addListener('clickMarqueeEvent', e => {
  // 添加事件处理
});
callRNFunction

除了DeviceEventEmitter之外,还可以使⽤callRNFunction完成。

this.ctx.rnInstance.callRNFunction(moduleName: string, functionName: string, args:  unknown[]): void; 

该⽅法包括了三个参数,分别是moduleName:调⽤的模块名,functionName:调⽤的模块的⽅法名,args:需要传的参数。

分享
微博
QQ
微信
回复
2024-12-25 12:41:48
相关问题
HarmonyOS端如何给RN发送事件通知
563浏览 • 1回复 待解决
HarmonyOS RN支持重写框架层TurboModule
341浏览 • 1回复 待解决
JS API web组件 怎么使用
5712浏览 • 1回复 待解决
HarmonyOS RN如何拦截返回事件
195浏览 • 1回复 待解决
HarmonyOS 怎么主动发送通知
329浏览 • 1回复 待解决
HarmonyOS Web组件注入js怎么传递对象
643浏览 • 1回复 待解决
HarmonyOS JS和TS底层渲染模式
197浏览 • 1回复 待解决