那么书接上回,今天主要是继续探究React Native
与原生模块的架构方式。
原生模块
原生模块可以访问activity
、运行环境、GPS、存储空间等。原生模块就是能够在JavaScript
层调用的API。
因为对原生模块的全部请求都要异步执行。如果原生方法需要为JavaScript
层的调用返回数据,该操作将通过promise
或者回调函数来完成。React Native
为这两种方式都提供了接口。
剖析原生模块
IOS
和Android
对原生模块的实现思路是这样的:
- 每个模块继承自原生模块父类。
- 每个模块都定义了名称,以便
JavaScript
层访问。 - 每个模块都导出可调用的方法,并包含
Java
的注释或Objective-C
的宏。
01. Android
Android
平台的原生模块继承ReactContextBaseJavaModule
,并且必须实现getName
方法,它的返回值作为JavaScript
模块的名称。
任何允许JavaScript
层调用的方法,都带有@ReactMethod
注释。React
的内部机制会把JavaScript
层的请求映射到这些方法上。每个方法的身份由它的签名、名称以及参数进行鉴别。方法所需的任何参数都会被转换成对应的属性类型。
简单的示例在上一篇已经提及,请参阅React Native与原生模块、组件之间的关系浅析
02. JavaScript
JavaScript
层把原生模块作为NativeModules
对象的一个属性,并且任何带有@ReactMethod
注释或者属于RCT_EXPORT_METHOD
宏的方法都能够被调用。
参数
原生模块的方法和普通方法一样可以接受参数。
针对于Android
,带有@ReactMethod
注释的方法支持以下参数类型。
Boolean
->Bool
Integar
->Number