react native 原生模块桥接的简单说明小结


Posted in Javascript onFebruary 26, 2019

Android

创建原生模块包

  • 通过继承 ReactPackage 为你的原生模块包创建 Java 类,可以这么写:
  • 覆盖 createNativeModules 和 createViewManagers 方法
public class MyNativePackage implements ReactPackage {
  @Override
  public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
  }

  @Override
  public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
  }
}

在 createNativeModules 方法中添加原生模块

public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
  List<NativeModule> modules = new ArrayList<>();
  modules.add(new MyNativeModule(reactContext));

  return modules;
}

在 createViewManagers 方法中添加原生 UI 组件

public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
  List<ViewManager> components = new ArrayList<>();
  components.add(new RNNativeComponent());

  return components;
}

创建原生模块

先通过继承 ReactContextBaseJavaModule 创建 MyNativeModule 类。

public class MyNativeModule extends ReactContextBaseJavaModule {
  public MyNativeModule(ReactApplicationContext reactContext) {
    super(reactContext);
  }
}

为了让 React Native 在 NativeModules 中找到我们的模块,我们还需要覆盖 getName 方法。

@Override
public String getName() {
  return "MyNativeModule";
}

现在我们已经拥有一个可以导入到 JavaScript 代码的原生模块,现在可以向其中加入功能。

暴露模块方法:定义一个接受设置参数、成功回调和失败回调的 Show 方法。

public class MyNativeModule extends ReactContextBaseJavaModule {
  @ReactMethod
  public void Show(ReadableMap config, Callback successCallback, Callback cancelCallback) {
    Activity currentActivity = getCurrentActivity();

    if (currentActivity == null) {
      cancelCallback.invoke("Activity doesn't exist");
      return;
    }
  }
}

在 JavaScript 中调用模块方法

import { NativeModules } from 'react-native'

const { MyNativeModule } = NativeModules

MyNativeModule.Show(
 {}, //Config Parameters
 () => {}, //Success Callback
 () => {} //Cancel Callback
)

注意:

模块方法只提供静态引用,不包含于 react 树中。

创建原生 UI 组件

如果你需要在 react 树中渲染一个原声 UI 组件

创建一个继承 ReactNative ViewGroupManager 的 Java 类

public class RNNativeComponent extends ViewGroupManager<ViewGroup> {
  public static final String REACT_CLASS = "RNNativeComponent";
}

覆盖 getName 方法:

@Override
public String getName() {
  return REACT_CLASS;
}

覆盖 createViewInstance 方法,返回你的自定义原生组件

@Override
 protected FrameLayout createViewInstance(final ThemedReactContext reactContext) {
   return //用 FrameLayout 包裹的自定义原生组件
 }

创建原生 prop 方法

@ReactProp(name = "prop_name")
 public void setPropName(NativeComponent nativeComponent, propDataType prop) {
 }

JavaScript 中使用

import { requireNativeComponent } from "react-native"

const MyNativeComponent = requireNativeComponent("RNNativeComponent", RNNativeComponent, {
 nativeOnly: { }
})

<MyNativeComponent prop={this.props.prop}>

iOS

Macro

  • RCTBridgeModule: RCTBridgeModule 是一个 protocol,它为注册 bridge 模块 RCTBridgeModule @protocol RCTBridgeModule 提供了一个接口
  • RCT_EXPORT_MODULE(js_name): 在 class implementation 时使用 bridge 注册你的模块。参数 js_name 是可选的,用作 JS 模块的名称,若不定义,将会默认使用 Objective-C 的 class 名
  • RCT_EXPORT_METHOD(method)RCT_REMAP_METHOD(, method): bridge 模块亦可定义方法,这些方法可以作为 NativeModules.ModuleName.methodName 输出到 JavaScript。
RCT_EXPORT_METHOD(funcName:(NSString *)onlyString
          secondName:(NSInteger)argInteger)
 { ... }

上面的例子暴露到 JavaScript 是 NativeModules.ModuleName.funcName

创建原生模块包

我们需要在项目中添加两个文件:头文件和源文件。

- MyNativePackage.h

#import "RCTBridgeModule.h"

@interface MyNativePackage : NSObject <RCTBridgeModule>
@end

- MyNativePackage.m

#import "MyNativePackage.h"

@implementation MyNativePackage

RCT_EXPORT_MODULE();

@end

创建模块方法

RCT_EXPORT_METHOD(Show:(RCTResponseSenderBlock)callback) {
}

JavaScript 中引入模块方法

import { NativeModules } from 'react-native'

const MyNativeModule = NativeModules.MyNativeModule
MyNativeModule.Show(() => {})

创建原生 View 组件

创建 view 方法,返回你的原声组件

- (UIView *)view {
  //Initialize & return your native component view
}

创建原生 prop 方法

RCT_CUSTOM_VIEW_PROPERTY(prop, DATA_TYPE_OF_PROP, YOUR_NATIVE_COMPONENT_CLASS) {
}

在 JavaScript 中使用

import { requireNativeComponent } from "react-native"

const MyNativeComponent = requireNativeComponent("RNNativeComponent", RNNativeComponent, {
 nativeOnly: { }
})

<MyNativeComponent prop={this.props.prop}>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript效率调优经验
Jun 04 Javascript
javascript 基础篇3 类,回调函数,内置对象,事件处理
Mar 14 Javascript
顶部缓冲下拉菜单导航特效的JS代码
Aug 27 Javascript
javascript获取选中的文本的方法代码
Oct 30 Javascript
JS兼容浏览器的导出Excel(CSV)文件的方法
May 03 Javascript
Backbone.js 0.9.2 源码注释中文翻译版
Jun 25 Javascript
javascript解决IE6下hover问题的方法
Jul 28 Javascript
Struts2+jquery.form.js实现图片与文件上传的方法
May 05 Javascript
简单的JS轮播图代码
Jul 18 Javascript
Vue组件中prop属性使用说明实例代码详解
May 31 Javascript
vue实现前端分页完整代码
Jun 17 Javascript
vue-preview动态获取图片宽高并增加旋转功能的实现
Jul 29 Javascript
JavaScript实现获取两个排序数组的中位数算法示例
Feb 26 #Javascript
小程序hover-class点击态效果实现
Feb 26 #Javascript
JS实现计算小于非负数n的素数的数量算法示例
Feb 26 #Javascript
vue使用Font Awesome的方法步骤
Feb 26 #Javascript
JS实现的杨辉三角【帕斯卡三角形】算法示例
Feb 26 #Javascript
create-react-app使用antd按需加载的样式无效问题的解决
Feb 26 #Javascript
JS实现电话号码的字母组合算法示例
Feb 26 #Javascript
You might like
thinkphp的c方法使用示例
2014/02/24 PHP
PHP捕获Fatal error错误的方法
2014/06/11 PHP
phpmailer在服务器上不能正常发送邮件的解决办法
2014/07/08 PHP
php中http与https跨域共享session的解决方法
2014/12/20 PHP
一个简单的php MVC留言本实例代码(必看篇)
2016/09/22 PHP
PHP APP微信提现接口代码
2018/09/30 PHP
Laravel 自带的Auth验证登录方法
2019/09/30 PHP
一段利用WSH获取登录时间的jscript代码
2008/05/11 Javascript
DOM基础教程之模型中的模型节点
2015/01/19 Javascript
js实现简洁的滑动门菜单(选项卡)效果代码
2015/09/04 Javascript
Jquery操作Ajax方法小结
2015/11/29 Javascript
9种改善AngularJS性能的方法
2017/11/28 Javascript
详解webpack自定义loader初探
2018/08/29 Javascript
前端防止用户重复提交js实现代码示例
2018/09/07 Javascript
swiper.js插件实现pc端文本上下滑动功能示例
2018/12/03 Javascript
一篇文章,教你学会Vue CLI 插件开发
2019/04/17 Javascript
vue-cli脚手架打包静态资源请求出错的原因与解决
2019/06/06 Javascript
javscript 数组扁平化的实现
2020/02/03 Javascript
[01:03]PWL开团时刻DAY6——别打我
2020/11/05 DOTA
pandas or sql计算前后两行数据间的增值方法
2018/04/20 Python
python opencv 简单阈值算法的实现
2019/08/04 Python
Python中IP地址处理IPy模块的方法
2019/08/16 Python
Python urlopen()和urlretrieve()用法解析
2020/01/07 Python
python——全排列数的生成方式
2020/02/26 Python
python实现吃苹果小游戏
2020/03/21 Python
ipython jupyter notebook中显示图像和数学公式实例
2020/04/15 Python
python3通过udp实现组播数据的发送和接收操作
2020/05/05 Python
Python3开发环境搭建详细教程
2020/06/18 Python
Python正则re模块使用步骤及原理解析
2020/08/18 Python
python pyg2plot的原理知识点总结
2021/02/28 Python
纯CSS3单页切换导航菜单界面设计的简单实现
2016/08/16 HTML / CSS
SmartBuyGlasses台湾:名牌眼镜,名牌太阳眼镜及隐形眼镜
2017/01/04 全球购物
会计助理的岗位职责
2013/11/29 职场文书
大型会议策划方案
2014/05/17 职场文书
2015年安置帮教工作总结
2015/05/22 职场文书
小组口号霸气押韵
2015/12/24 职场文书