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 相关文章推荐
特殊字符、常规符号及其代码对照表
Jun 26 Javascript
jquery1.4.2 for Visual studio 2010 模板文件
Jul 14 Javascript
javascript高级学习笔记整理
Aug 14 Javascript
JS实现可缩放、拖动、关闭和最小化的浮动窗口完整实例
Mar 04 Javascript
jQuery日历插件datepicker用法详解
Mar 03 Javascript
AngularJS实现ajax请求的方法
Nov 22 Javascript
Vue精简版风格概述
Jan 30 Javascript
解决微信小程序防止无法回到主页的问题
Sep 28 Javascript
Vue绑定内联样式问题
Oct 17 Javascript
vuex存储token示例
Nov 11 Javascript
vue如何使用async、await实现同步请求
Dec 09 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 解决utf-8和gb2312编码转换问题
2010/03/18 PHP
php获取中文拼音首字母类和函数分享
2014/04/24 PHP
php读取目录及子目录下所有文件名的方法
2014/10/20 PHP
php中注册器模式类用法实例分析
2015/11/03 PHP
php结合md5的加密解密算法实例
2016/09/30 PHP
Laravel5.1 框架Middleware中间件基本用法实例分析
2020/01/04 PHP
基于php伪静态的实现方法解析
2020/07/31 PHP
js检测客户端不是firefox则提示下载
2007/04/07 Javascript
老鱼 浅谈javascript面向对象编程
2010/03/04 Javascript
Webkit的跨域安全问题说明
2011/09/13 Javascript
Extjs4中的分页应用结合前后台
2013/12/13 Javascript
JavaScript中发布/订阅模式的简单实例
2014/11/05 Javascript
简单实现JavaScript图片切换效果
2016/11/28 Javascript
JS验证不重复验证码
2017/02/10 Javascript
JavaScript实现的XML与JSON互转功能详解
2017/02/16 Javascript
SpringMVC+bootstrap table实例详解
2017/06/02 Javascript
详解基于vue-cli优化的webpack配置
2017/11/06 Javascript
小程序实现列表倒计时功能
2021/01/29 Javascript
JavaScript实现筛选数组
2021/03/02 Javascript
python实现划词翻译
2020/04/23 Python
详解Python文本操作相关模块
2017/06/22 Python
浅谈python for循环的巧妙运用(迭代、列表生成式)
2017/09/26 Python
python实现kNN算法
2017/12/20 Python
详解Python利用random生成一个列表内的随机数
2019/08/21 Python
Django Form and ModelForm的区别与使用
2019/12/06 Python
Python中os模块功能与用法详解
2020/02/26 Python
python GUI库图形界面开发之PyQt5表格控件QTableView详细使用方法与实例
2020/03/01 Python
django项目中新增app的2种实现方法
2020/04/01 Python
HTML5 canvas基本绘图之绘制阴影效果
2016/06/27 HTML / CSS
Soft Cotton捷克:来自爱琴海棉花的浴袍
2017/02/01 全球购物
世界上第一个水枕头:Mediflow
2018/12/06 全球购物
美国购买体育赛事门票网站:TicketCity
2019/03/06 全球购物
eBay奥地利站:eBay.at
2019/07/24 全球购物
工商管理自荐书
2014/07/06 职场文书
我的大学四年规划书范文2014
2014/09/26 职场文书
Oracle中DBLink的详细介绍
2022/04/29 Oracle