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 相关文章推荐
jQuery div层的放大与缩小简单实现代码
Mar 28 Javascript
javascript父、子页面交互技巧总结
Aug 08 Javascript
jQuery元素属性操作实例(设置、获取及删除元素属性)
Sep 08 Javascript
微信小程序 使用picker封装省市区三级联动实例代码
Oct 28 Javascript
jQuery.ajax实现根据不同的Content-Type做出不同的响应
Nov 03 Javascript
js自制图片放大镜功能
Jan 24 Javascript
VUE前端cookie简单操作
Oct 17 Javascript
11个教程中不常被提及的JavaScript小技巧(推荐)
Apr 17 Javascript
Vue的路由及路由钩子函数的实现
Jul 02 Javascript
vue实现的多页面项目如何优化打包的步骤详解
Jul 19 Javascript
js 图片懒加载的实现
Oct 21 Javascript
一起来了解一下JavaScript的预编译(小结)
Mar 01 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
缓存技术详谈―php
2006/12/14 PHP
PHP实现MVC开发得最简单的方法――模型
2007/04/10 PHP
PHP在引号前面添加反斜杠(PHP去除反斜杠)
2013/09/28 PHP
php语言中使用json的技巧及json的实现代码详解
2015/10/27 PHP
标准版Eclipse搭建PHP环境的详细步骤
2015/11/18 PHP
浅谈Yii乐观锁的使用及原理
2017/07/25 PHP
laravel5表单唯一验证的实例代码
2019/09/30 PHP
IE6/7/8/9不支持exec的简写方式
2011/05/25 Javascript
利用js正则表达式验证手机号,email地址,邮政编码
2014/01/23 Javascript
AngularJS的表单使用详解
2015/06/17 Javascript
js下将金额数字每三位一逗号分隔
2016/02/19 Javascript
jquery通过name属性取值的简单实现方法
2016/06/20 Javascript
新手学习前端之js模仿淘宝主页网站
2016/10/31 Javascript
浅谈vue中数据双向绑定的实现原理
2017/09/14 Javascript
js实现数组内数据的上移和下移的实例
2017/11/14 Javascript
swiper.js插件实现pc端文本上下滑动功能示例
2018/12/03 Javascript
基于vue.js组件实现分页效果
2018/12/29 Javascript
vue项目出现页面空白的解决方案
2019/10/31 Javascript
jQuery实现颜色打字机的完整代码
2020/03/19 jQuery
vue实现在线学生录入系统
2020/05/30 Javascript
vue实践---vue不依赖外部资源实现简单多语操作
2020/09/21 Javascript
Python自动化构建工具scons使用入门笔记
2015/03/10 Python
python 异常处理总结
2016/10/18 Python
Python Django2.0集成Celery4.1教程
2019/11/19 Python
OpenCV哈里斯(Harris)角点检测的实现
2020/01/15 Python
如何使用selenium和requests组合实现登录页面
2020/02/03 Python
台湾母婴用品购物网站:Infant婴之房
2018/06/15 全球购物
南京软件公司的.net程序员笔试题
2014/08/31 面试题
Ajax和javascript的区别
2013/07/20 面试题
化工专业求职信
2014/07/01 职场文书
四风问题自查自纠工作情况报告
2014/10/28 职场文书
预备党员个人总结
2015/02/14 职场文书
债务纠纷代理词
2015/05/25 职场文书
现货白银电话营销话术
2015/05/29 职场文书
2015年秋学期教研工作总结
2015/10/14 职场文书
为什么MySQL 删除表数据 磁盘空间还一直被占用
2021/10/16 MySQL