当前位置: 首页 > 知识库问答 >
问题:

如何编写重用常见JavaScript代码的react本机“本机模块”(桥接器)?

江阳夏
2023-03-14

本机模块如何回调JavaScript内部桥接方法,然后在内部方法中进行处理,例如将数据解析为JSON,然后引发react本机应用程序接收的事件?

对于跨平台桥接模块,我想避免在ObjectiveC和Java中重复代码。如果可能,我想用JavaScript编写跨平台桥接模块代码,并在Android和iOS中重用。

我当前的解决方案:

这工作。

这将导致两次调用sendEventWithName:

  1. 使用“processResponseInJavaScriptMethod”发送带有名称的事件

问题:

是否有一种方法可以让本机代码使用JS调用同步处理数据,然后使用sendEventSusName立即发送结果?

或者每个本地人

文件:MyNativeModule. m

// Use forwardEventWithName to forward events 
// processed by common cross-platform JS to the react native app
RCT_EXPORT_METHOD(forwardEventWithName:(NSString*)name
                  body:(NSString*)body) {
    [self sendEventWithName:name body:body];
}

// 1 - react native app calls sendQueryToBluetoothDevice
// 2 - device calls commandResponse when response received
RCT_EXPORT_METHOD(sendQueryToBluetoothDevice:(NSString*)command {
    [_device sendCommand:command];
}

// 1 - Receives XML response from external Bluetooth device
// 2 - Sends XML to internal JS method for processing
// 3 - Internal JS method uses forwardEventWithName 
//     to send event to react native app
- (void) commandResponse:(NSString *) xml {    
    [self sendEventWithName:@"_processResponseInJavaScriptMethod"
                       body:@{@"xml": configuration}];

}

文件:索引。js(本机模块)

 // Parse xml in common JS code for both Android and iOS native modules
emitter.addListener("_processResponseInJavaScriptMethod", (e) => {
    const body = parseXml(e.xml);

    // ?? Is there a way to send event directly using JS to the react native app ??

    // Hack - Call native method forwardEventWithName to sendEventWithName to react native app.
    ///
    // This makes two _bridge enqueueJSCall's
    // 1 - One call to sendEventWithName "_myNativeModuleInternalMethod"
    // 2 - Second call to sendEventWithName "myNativeModuleEvent
    MyNativeModule.forwardEventWithName(
      'myNativeModuleEventResponseReceived', 
       JSON.stringify(body));
  }
})

共有2个答案

呼延光明
2023-03-14

不确定你所说的内部桥接模块Java脚本方法是什么意思,但是JS代码可以通过方法将数据传递给本机,本机可以通过回调或promise将数据返回给JS。本机代码也可以向JS发送事件。

JS       --->     Native   // Method calls
Native   --->     JS       // Callbacks, Promises, Events

有关更多详细信息,请参阅本机模块文档:-https://facebook.github.io/react-native/docs/native-modules-ios.html - https://facebook.github.io/react-native/docs/native-modules-android.html

谢哲瀚
2023-03-14

我建议在React Native中读一些关于批处理桥的内容。

本地人-

基本上,您可以使用JS端的静态方法定义一个模块,然后将其注册到批处理桥(registerCallableModule),这使您能够通过RCTBridge()从本机端直接调用此方法。enqueueJSCall,其中您将提供分别对应于您的模块和函数的moduleDotMethod;您还将传递一个唯一(或增量)标识符,稍后用于将响应映射到每个请求。

JS公司-

接下来,您将创建一个本机模块,该模块将在JS端被调用,以将数据发送回本机,传递响应数据和标识符,然后您将在本机端处理这些数据和标识符。

我曾参与过整个服务层位于JS端的项目,并成功地使用了这种方法。

 类似资料:
  • 我想从本机模块调用react本机函数。 我已经为我的react原生应用程序创建了一个条形码扫描仪插件,条形码扫描仪SDK在原生IOS中可用 现在我的问题是,一旦条形码扫描仪扫描数据并发送到本机IOS,我如何在我的反应本机应用程序中获取这些扫描数据?(我在IOS本机中获得了扫描数据) 我想在本机模块扫描数据并将这些数据发送到react-本机时调用react-本机应用程序函数 请给出例子或适当的文件,

  • 朋友们好,我想让我的插件在react native中,我想从我的react native js文件调用我的ios native module函数,下面是我的代码 ios库代码如下 JS文件代码如下 我只想从我的js文件调用简单的函数到ios本机库类,但当我运行上面的代码时,我得到了像TypeError这样的错误:未定义不是一个对象(评估“MyLibManager.find事件”) 知道我该怎么解决

  • 问题内容: 有什么办法可以看到JavaScript本机代码的声明吗?每当我尝试查看Chrome或Firefox中的本机功能时,都会显示“ ”: 这是什么意思,有什么工具可以帮助我阅读实际代码? 问题答案: Chrome或Firefox之所以说该代码是本地代码,是因为它确实是本地代码-WebKit和Firefox开发人员已使用C或C ++(而非JavaScript)对该功能进行了编码。但是,如果您想

  • 问题内容: 我陷入了本机项目中的一个问题。我试图做一个通用的需求文件,在其中导出所有模块。之后,我只需要我的“ require.js”文件,以避免在每个文件中都这样调用require(’../../ ModuleName’)。 我有4个文件: require.js: 在index.ios.js中(他的Home和MyView模块正确获取了importet) Home.js(模块MyView没有获得重

  • 我在这里遵循了教程的第一步: https://facebook.github.io/react-native/docs/getting-started.html 然后我想从设备传感器中读取信息。 为此,我还学习了本教程: https://medium.com/react-native-training/using-sensors-in-react-native-b194d0ad9167 并以以下代