React Native - 构建 Native Module 图示指南

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

这篇文章很详细,

http://www.liuchungui.com/blog/2016/05/08/reactnativezhi-yuan-sheng-mo-kuai-kai-fa-bing-fa-bu-androidpian/

相关文章

一、前言 在组件方面react和Vue一样的,核心思想玩的就是组件...
前言: 前段时间学习完react后,刚好就接到公司一个react项目...
前言: 最近收到组长通知我们项目组后面新开的项目准备统一技...
react 中的高阶组件主要是对于 hooks 之前的类组件来说的,如...
我们上一节了解了组件的更新机制,但是只是停留在表层上,例...
我们上一节了解了 react 的虚拟 dom 的格式,如何把虚拟 dom...