React Native 支持使用 Java 或者 Objective-C 来构建本地的模块,并和 JS 通信,从而在 JS 中,可以调用模块中的函数,并得到结果。
对于如何构建 Native Module,官方文档以及给了详细的说明,这里只是以图解的方式讲述如何操作。
iOS 部分
第一步,打开 Xcode,并选择新建项目,请选择 Cocoa Touch static library :
第二步,输入项目的名字等,并保存:
第三步,如果你的代码需要任何一种库,请选择库:
然后,开始书写你的代码:
在头文件里面,加入 FB 提供的库的头文件,并指派类支持它:
- #import <Foundation/Foundation.h>
- #import <React/RCTBridgeModule.h>
- #import <React/RCTLog.h>
- @interface MyComponent : NSObject <RCTBridgeModule>
- @end
回到 MyComponent.m,加入
- #import "MyComponent.h"
- @implementation MyComponent
- // 告诉 RN,在 JS 中访问此 Native Module 的时候,使用 NativeModules.MyComponent 的名字
- RCT_EXPORT_MODULE();
- @end
最后,加入,要提供给 JS 调用的方法,这里支持两种调用模式,一种是同步的调用,此方法将运行与 JS 的线程之中,并阻塞当前的操作,直到完成,如下:
- RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(helloSync:(NSString *)greeting)
- {
- // RCTLogInfo(@" %@",greeting);
- return @"Hi I am here";
- }
另一种是,异步的调用,线程将在 RN 指派的线程队列执行,使用 Promise 返回结果,如下:
- RCT_EXPORT_METHOD(hello:(NSString *)greeting resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject)
- {
- if ([greeting isEqualToString: @""]) {
- NSError *error = [NSError errorWithDomain:@"example" code:200 userInfo: nil];
- reject(@"",@"",error);
- return;
- }
- resolve(@"Hi,I am here");
- }
最后,使用 JS 在 RN 中调用它们:
剩下的就是加入你的 RN 项目,如下:
先使用 npm 创建一个本地的PKG。
- mkdir MyComponent
- cd MyComponent
- npm init
给一个包的名字,叫做 react-native-mycomponent-example 好了。
然后,在你的 RN 项目的 package.json 的依赖部分中,使用 local path,如下:
- "react-native-mycomponent-example": "file: ./MyComponent"
注意,file 后面是你存放自己的 component 的文件夹。
然后,安装并链接,如下:
- npm install react-native-mycomponent-example
- react-native link react-native-mycomponent-example
开始使用吧!你并不需要发布你的组件,使用 local path 是一种访问本地组件的简单方法。
相当容易,这样你可以把 JS 中无法完成或者是性能低的代码放到 Native Module 里面完成。
Android / Java 部分
Android 部分更加简单,如果你用的是 Android Studio,
这篇文章很详细,