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 中调用它们:
import { NativeModules } from 'react-native'; const MyComponent = NativeModules.MyComponent; const reply = MyComponent.helloSync ('Hi'); console.log(reply); // 调用异步方法 MyComponent.hello ('Hi').then ((reply) => { console.log(reply); }).catch (err => console.log(err));
剩下的就是加入你的 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,
这篇文章很详细,