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显示用户停留时间的简单实例
Aug 05 Javascript
JS 对象属性相关(检查属性、枚举属性等)
Apr 05 Javascript
jquery利用拖拽方式在图片上添加热链接
Nov 24 Javascript
基于jQuery实现放大镜特效
Oct 19 Javascript
jquery.Callbacks的实现详解
Nov 30 Javascript
详解JavaScript树结构
Jan 09 Javascript
node学习记录之搭建web服务器教程
Feb 16 Javascript
JS 中LocalStorage和SessionStorage的使用
Aug 17 Javascript
vue 自定义提示框(Toast)组件的实现代码
Aug 17 Javascript
js隐式转换的知识实例讲解
Sep 28 Javascript
详解Jest结合Vue-test-utils使用的初步实践
Jun 27 Javascript
利用原生JS实现欢乐水果机小游戏
Apr 23 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函数,php爱好者站推荐
2007/03/19 PHP
教你识别简单的免查杀PHP后门
2015/09/13 PHP
Yii框架表单提交验证功能分析
2017/01/07 PHP
Bootstrap表单布局
2016/07/19 Javascript
javascript设计模式Constructor(构造器)模式
2016/08/19 Javascript
PhotoSwipe异步动态加载图片方法
2016/08/25 Javascript
纯JS单页面赛车游戏制作代码分享
2017/03/03 Javascript
又一款MVVM组件 构建自己的Vue组件(2)
2017/03/13 Javascript
浅谈箭头函数写法在ReactJs中的使用
2017/08/22 Javascript
详解利用 Vue.js 实现前后端分离的RBAC角色权限管理
2017/09/15 Javascript
AngularJS实现的省市二级联动功能示例【可对选项实现增删】
2017/10/26 Javascript
js原生日历的实例(推荐)
2017/10/31 Javascript
浅谈webpack对样式的处理
2018/01/05 Javascript
Vue项目数据动态过滤实践及实现思路
2018/09/11 Javascript
JS实现的新闻列表自动滚动效果示例
2019/01/30 Javascript
详解vue 2.6 中 slot 的新用法
2019/07/09 Javascript
在layui中对table中的数据进行判断(0、1)转换为提示信息的方法
2019/09/28 Javascript
解决removeEventListener 无法清除监听的问题
2020/10/30 Javascript
python实现文件名批量替换和内容替换
2014/03/20 Python
Python学习笔记_数据排序方法
2014/05/22 Python
Python实时获取cmd的输出
2015/12/13 Python
python基础教程之分支、循环简单用法
2016/06/16 Python
Python3操作SQL Server数据库(实例讲解)
2017/10/21 Python
5款非常棒的Python工具
2018/01/05 Python
Python获取指定文件夹下的文件名的方法
2018/02/06 Python
Python中跳台阶、变态跳台阶与矩形覆盖问题的解决方法
2018/05/19 Python
100行Python代码实现每天不同时间段定时给女友发消息
2019/09/27 Python
python中怎么表示空值
2020/06/19 Python
目前不被任何主流浏览器支持的CSS3属性汇总
2014/07/21 HTML / CSS
驴妈妈旅游网:中国新型的B2C旅游电子商务网站
2016/08/16 全球购物
大一新生学期自我评价
2014/04/09 职场文书
党员批评与自我批评范文
2014/09/23 职场文书
四风专项整治工作情况汇报
2014/10/28 职场文书
小学四年级作文之最感动的一件事
2019/11/01 职场文书
MySQL学习总结-基础架构概述
2021/04/05 MySQL
Java 数据结构七大排序使用分析
2022/04/02 Java/Android