React-native 與原生模塊之間的交互

與原生模塊之間交互,主要分兩種,

一. 只需要導出方法 傳遞參數等交互 模塊之間交互

二. 視圖交互 JS 需要用到native的原生的視圖控件

為了看得更直接先上圖

原生模塊 ps:這是一個APP的是否允許通知的功能 需要把native獲得的信息傳到js,js端根據是否打開通知去做處理

//本地新建一個manager類繼承自NSObject 遵守RCTBridgeMoudle協議

// 暴露出來模塊和方法 js端主動調用這個方法 在callback回調里把獲取到的是否打開通知的參數傳給js

js端

// 就是這麼簡單 利用NativeModule獲取到該模塊,調用native方法,在回調里取到參數,setState

1>>> 創建ios模塊

創建一個接口,實現RCTBridgeModule協議,然後把想在JS中調用的方法用RCT_EXPORT_METHOD包裝,最後再用RCT_EXPORT_MODULE 導出即可

// native 可以這麼寫

#import "RCTBridgeModule.h"

@interface MyCustomModule : NSObject <RCTBridgeModule>

@end

@implementation MyCustomModule

RCT_EXPORT_MODULE();

// Available as NativeModules.MyCustomModule.processString

RCT_EXPORT_METHOD(processString:(NSString *)input callback:(RCTResponseSenderBlock)callback)

{

// 這個方法由JS主動調用 如果需要native傳遞參數給JS 可以採用這種回調的方式

callback(@[[input stringByReplacingOccurrencesOfString:@"Goodbye" withString:@"Hello"]]);

}

@end

//JS端 可以這麼寫

import React, {

Component,

} from 'react';

import {

NativeModules,

Text

} from 'react-native';

class Message extends Component {

constructor(props) {

super(props);

this.state = { text: 'Goodbye World.' };

}

componentDidMount() {

NativeModules.MyCustomModule.processString(this.state.text, (text) => {

this.setState({text});

});

}

render() {

return (

<Text>{this.state.text}</Text>

);

}

}

顯示先上圖

// 跟中文網上的一樣還是搞mapView

// native端

// 我覺得這兩個都沒什麼好解釋的吧  唯一一個注意點是 一定要導出個屬性,不然就是一個紅色的方框,不會顯示出來地圖,應該是官方的bug

js 端

// 也很容易  先創建一個View組件 mapView.js  導出組件  然後再page中把它當成一個視圖一樣使用就行了

1>>> 創建ios View

自定義iOS   View 首先創建一個manager類,繼承自RCTViewManager,然後實現一個-(UIView *)view方法.並且使用RCT_EXPORT_VIEW_PEOPERTY導出屬性,最後用一個js文件鏈接并進行包裝

// native 可以這麼寫

#import "RCTViewManager.h"

@interface MyCustomViewManager : RCTViewManager

@end

//  js端  var XXX(下面引用的組件名) = requireNativeComponent(‘原生模塊名’,當前js類名)

@implementation MyCustomViewManager

RCT_EXPORT_MODULE()

RCT_EXPORT_VIEW_PROPERTY(myCustomProperty, NSString);  // 導出屬性

- (UIView *)view

{

//MyCustomerView 即為原生的要導出的View

return [[MyCustomView alloc] init];

}

@end

//JS端 可以這麼寫 封裝成一個view組件

import React, {

Component,

} from 'react';

import PropTypes from 'prop-types';

import { requireNativeComponent } from 'react-native';

var NativeMyCustomView = requireNativeComponent('MyCustomView', MyCustomView);

export default class MyCustomView extends Component {

static propTypes = {

myCustomProperty: PropTypes.oneOf(['a', 'b']),

};

render() {

return <NativeMyCustomView {...this.props} />;

}

}

转载于:https://www.cnblogs.com/ChrisZhou666/p/7724128.html

react-native 原生組件封裝與原生模塊和js的交互相关推荐

  1. React Native Android 源码框架浅析(主流程及 Java 与 JS 双边通信)

    [工匠若水 http://blog.csdn.net/yanbober 未经允许严禁转载,请尊重作者劳动成果.私信联系我] 1 背景 有了前面<React Native Android 从学车到 ...

  2. React Native使用指南-原生UI组件

    在如今的App中,已经有成千上万的原生UI部件了--其中的一些是平台的一部分,另一些可能来自于一些第三方库,而且可能你自己还收藏了很多.React Native已经封装了大部分最常见的组件,譬如Scr ...

  3. React Native之js调用Android原生使用Callback传递结果给js

    如果不清楚js如何调用Android原生,可以先参考我的这篇博客React Native实现js调用安卓原生代码 1 问题 上面的文章只是调用安卓原生显示Toast,但是我们一般会需要调用安卓的代码然 ...

  4. React Native实现js调用安卓原生代码

    1 问题 实现js调用安卓原始代码,直接上代码,简单粗暴 2 代码实现 1) 实现一个继承ReactContextBaseJavaModule的类,MyToastModule.java文件如下 pub ...

  5. React Native开发指南-在原生和React Native间通信

    通过植入原生应用和原生UI组件两篇文档,我们学习了React Native和原生组件的互相整合.在整合的过程中,我们会需要在两个世界间互相通信.有些方法已经在其他的指南中提到了,这篇文章总结了所有可行 ...

  6. React Native Android原生模块开发实战|教程|心得|怎样创建React Native Android原生模块...

    尊重版权,未经授权不得转载 本文出自:贾鹏辉的技术博客(http://blog.csdn.net/fengyuzhengfan/article/details/54691503) 告诉大家一个好消息. ...

  7. Android React Native使用原生UI组件

    Android React Native 已经将几个常用的原生组件进行了封装,比如 ScrollView 和 TextInput,但是并不是所有系统的原始组件都被封装了,因此有的时候我们不得不自己动手 ...

  8. 如何开发React Native 原生模块(Native Modules)?看完这篇文章就够了(Android)

    期待已久的新课上线啦!解锁React Native开发新姿势,一网打尽React Native最新与最热技术,点我Get!!! 前言 一直想写一下我在React Native原生模块封装方面的一些经验 ...

  9. React Native JSBundle拆包之原理篇

    概述 RN作为一款非常优秀的移动端跨平台开发框架,在近几年得到众多开发者的认可.纵观现在接入RN的大厂,如qq音乐.菜鸟.去哪儿,无疑不是将RN作为重点技术栈进行研发. 不过,熟悉RN的开发者也知道, ...

最新文章

  1. 10-20国际电极标准系统
  2. KeeSoft.DBHelper.DBFactory 数据库访问类
  3. 使用Qt Assistant
  4. 构造 Codeforces Round #275 (Div. 2) C. Diverse Permutation
  5. 彻底学会使用epoll(一)——ET模式实现分析
  6. ScrollView与TableView实现选择效果
  7. centos7 mysql
  8. javascript---DOM---事件
  9. 算法笔记_面试题_2.移动零(将数组的的0元素移到末尾)
  10. 32位oracle_ORACLE如何优化代码将查询速度从5s提升到0.1s
  11. 事关美亚柏科未来发展!智慧城市建设注入新动力
  12. Class 'Qcloud\Sms\SmsSingleSender' not found
  13. python 图片分别保存至文件夹(深度学习图片数据集处理)
  14. 兄dei,作为程序员的你,这些一直接触的词都念对了吗?
  15. Windows 10做了这9项优化 电脑跑得比谁都快
  16. 飞凌嵌入式FETMX6Q-C
  17. 奇虎归来:周鸿祎讲的新故事能否弯道超车
  18. CPU相关的18个概念
  19. Matlab函数trainingOptions参数解析
  20. 忘记Mac管理员密码怎么办?

热门文章

  1. [原]android2.3如何使用SharedPreferences存储字符串集合类型的元素
  2. Asp.net常用的操作函数
  3. 图像拼接和图像融合技术
  4. Git log高级用法
  5. 【Objective-C学习笔记】变量和基本的数据类型
  6. 分布式系统事务一致性解决方案
  7. Rainbond最佳实践:Tomcat配置Redis实现Session共享
  8. Oracle 11g数据库的部署
  9. DPM 2010(三)---Exchange2010单邮箱恢复
  10. Delphi命名规范