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 相关文章推荐
页面右下角弹出提示框示例代码js版
Aug 02 Javascript
优化javascript的执行效率一些方法总结
Dec 25 Javascript
jQuery formValidator表单验证
Jan 07 Javascript
JS使用cookie设置样式的方法
Jun 30 Javascript
js简单实现调整网页字体大小的方法
Jul 23 Javascript
AngularJS 整理一些优化的小技巧
Aug 18 Javascript
javascript 判断是否是微信浏览器的方法
Oct 09 Javascript
Vue引用Swiper4插件无法重写分页器样式的解决方法
Sep 27 Javascript
玩转Koa之核心原理分析
Dec 29 Javascript
js实现点击图片在屏幕中间弹出放大效果
Sep 11 Javascript
QML实现圆环颜色选择器
Sep 25 Javascript
javascript实现图片轮换动作方法
Aug 07 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
The specified CGI application misbehaved by not returning a complete set of HTTP headers
2011/03/31 PHP
php学习笔记之 函数声明
2011/06/09 PHP
php内核解析:PHP中的哈希表
2014/01/30 PHP
php通过strpos查找字符串出现位置的方法
2015/03/17 PHP
接收键盘指令的脚本
2006/06/26 Javascript
javascript与jquery中跳出循环的区别总结
2013/11/04 Javascript
浅析IE10兼容性问题(frameset的cols属性)
2014/01/03 Javascript
jquery判断元素是否隐藏的多种方法
2014/05/06 Javascript
简单实现异步编程promise模式
2015/07/31 Javascript
js点击文本框后才加载验证码实例代码
2015/10/20 Javascript
JavaScript实现弹出模态窗体并接受传值的方法
2016/02/12 Javascript
基于JS+Canves实现点击按钮水波纹效果
2016/09/15 Javascript
全选复选框JavaScript编写小结(附代码)
2017/08/16 Javascript
Vue v-for循环之@click点击事件获取元素示例
2019/11/09 Javascript
es6中let和const的使用方法详解
2020/02/24 Javascript
React倒计时功能实现代码——解耦通用
2020/09/18 Javascript
原生js实现俄罗斯方块
2020/10/20 Javascript
[01:01]青春无憾,一战成名——DOTA2全国高校联赛开启
2018/02/25 DOTA
使用python实现正则匹配检索远端FTP目录下的文件
2015/03/25 Python
Python变量访问权限控制详解
2019/06/29 Python
利用pyshp包给shapefile文件添加字段的实例
2019/12/06 Python
Python loguru日志库之高效输出控制台日志和日志记录
2020/03/07 Python
利用CSS3的transform做的动态时钟效果
2011/09/21 HTML / CSS
html5 分层屏幕适配的方法
2018/03/16 HTML / CSS
让ie浏览器成为支持html5的浏览器的解决方法(使用html5shiv)
2014/04/08 HTML / CSS
美国领先的医疗警报服务:Philips Lifeline
2018/03/12 全球购物
英国女性时尚品牌:Apricot
2018/12/04 全球购物
SmartBuyGlasses比利时:购买品牌太阳镜和眼镜
2019/08/09 全球购物
介绍一下Make? 为什么使用make
2016/07/31 面试题
口腔工艺技术专业毕业生自荐信
2013/09/27 职场文书
大学生万能检讨书范例
2014/10/04 职场文书
小学教师个人总结
2015/02/05 职场文书
2015年安全月活动总结
2015/03/26 职场文书
小学生暑假安全公约
2015/07/14 职场文书
幼儿教师远程研修感悟
2015/11/18 职场文书
python代码实现扫码关注公众号登录的实战
2021/11/01 Python