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自动隐藏手机浏览器的地址栏实现原理与代码
Jan 02 Javascript
JS 模态对话框和非模态对话框操作技巧汇总
Apr 15 Javascript
js实现超酷的照片墙展示效果图附源码下载
Oct 08 Javascript
javascript禁止超链接跳转的方法
Feb 02 Javascript
微信小程序scroll-view实现横向滚动和上拉加载示例
Mar 06 Javascript
javascript 中null和undefined区分和比较
Apr 19 Javascript
使用 Node.js 对文本内容分词和关键词抽取
May 27 Javascript
BootStrap导航栏问题记录
Jul 31 Javascript
Three.js利用orbit controls插件(轨道控制)控制模型交互动作详解
Sep 25 Javascript
微信小程序实现添加手机联系人功能示例
Nov 30 Javascript
echarts鼠标覆盖高亮显示节点及关系名称详解
Mar 17 Javascript
避坑之 JavaScript 中的toFixed()和正则表达式
Apr 19 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
使用GROUP BY的时候如何统计记录条数 COUNT(*) DISTINCT
2011/04/23 PHP
php 魔术方法详解
2014/11/11 PHP
thinkphp中session和cookie无效的解决方法
2014/12/19 PHP
php中使用sftp教程
2015/03/30 PHP
PHP生成各种常见验证码和Ajax验证过程
2016/01/10 PHP
PHP下 Mongodb 连接远程数据库的实例代码
2017/08/30 PHP
Yii框架应用组件用法实例分析
2020/05/15 PHP
prototype 的说明 js类
2006/09/07 Javascript
JS 实现获取打开一个界面中输入的值
2013/03/19 Javascript
JS判断表单输入是否为空(示例代码)
2013/12/23 Javascript
js鼠标点击图片切换效果实现代码
2015/11/19 Javascript
jQuery实现伪分页的方法分享
2016/02/17 Javascript
js中window.open的参数及注意注意事项
2016/07/06 Javascript
浅谈toLowerCase和toLocaleLowerCase的区别
2016/08/15 Javascript
Bootstrap轮播插件使用代码
2016/10/11 Javascript
Ionic2系列之使用DeepLinker实现指定页面URL
2016/11/21 Javascript
js倒计时显示实例
2016/12/11 Javascript
mpvue构建小程序的方法(步骤+地址)
2018/05/22 Javascript
js打开word文档预览操作示例【不是下载】
2019/05/23 Javascript
laravel实现中文和英语互相切换的例子
2019/09/30 Javascript
[01:08]DOTA2次级职业联赛 - Wings 战队宣传片
2014/12/01 DOTA
使用Python保存网页上的图片或者保存页面为截图
2016/03/05 Python
python中print的不换行即时输出的快速解决方法
2016/07/20 Python
matplotlib绘制符合论文要求的图片实例(必看篇)
2017/06/02 Python
keras实现VGG16方式(预测一张图片)
2020/07/07 Python
致跳远运动员加油稿
2014/02/11 职场文书
奉献演讲稿范文
2014/05/21 职场文书
档案工作汇报材料
2014/08/21 职场文书
公安四风对照检查材料思想汇报
2014/10/11 职场文书
2014年统战工作总结
2014/12/09 职场文书
2015年艾滋病防治工作总结
2015/05/22 职场文书
python tkinter模块的简单使用
2021/04/07 Python
Python基于百度API识别并提取图片中文字
2021/06/27 Python
redis 存储对象的方法对比分析
2021/08/02 Redis
mysql中DCL常用的用户和权限控制
2022/03/31 MySQL
SQL Server中的游标介绍
2022/05/20 SQL Server