react-native 原生組件封裝與原生模塊和js的交互
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的交互相关推荐
- React Native Android 源码框架浅析(主流程及 Java 与 JS 双边通信)
[工匠若水 http://blog.csdn.net/yanbober 未经允许严禁转载,请尊重作者劳动成果.私信联系我] 1 背景 有了前面<React Native Android 从学车到 ...
- React Native使用指南-原生UI组件
在如今的App中,已经有成千上万的原生UI部件了--其中的一些是平台的一部分,另一些可能来自于一些第三方库,而且可能你自己还收藏了很多.React Native已经封装了大部分最常见的组件,譬如Scr ...
- React Native之js调用Android原生使用Callback传递结果给js
如果不清楚js如何调用Android原生,可以先参考我的这篇博客React Native实现js调用安卓原生代码 1 问题 上面的文章只是调用安卓原生显示Toast,但是我们一般会需要调用安卓的代码然 ...
- React Native实现js调用安卓原生代码
1 问题 实现js调用安卓原始代码,直接上代码,简单粗暴 2 代码实现 1) 实现一个继承ReactContextBaseJavaModule的类,MyToastModule.java文件如下 pub ...
- React Native开发指南-在原生和React Native间通信
通过植入原生应用和原生UI组件两篇文档,我们学习了React Native和原生组件的互相整合.在整合的过程中,我们会需要在两个世界间互相通信.有些方法已经在其他的指南中提到了,这篇文章总结了所有可行 ...
- React Native Android原生模块开发实战|教程|心得|怎样创建React Native Android原生模块...
尊重版权,未经授权不得转载 本文出自:贾鹏辉的技术博客(http://blog.csdn.net/fengyuzhengfan/article/details/54691503) 告诉大家一个好消息. ...
- Android React Native使用原生UI组件
Android React Native 已经将几个常用的原生组件进行了封装,比如 ScrollView 和 TextInput,但是并不是所有系统的原始组件都被封装了,因此有的时候我们不得不自己动手 ...
- 如何开发React Native 原生模块(Native Modules)?看完这篇文章就够了(Android)
期待已久的新课上线啦!解锁React Native开发新姿势,一网打尽React Native最新与最热技术,点我Get!!! 前言 一直想写一下我在React Native原生模块封装方面的一些经验 ...
- React Native JSBundle拆包之原理篇
概述 RN作为一款非常优秀的移动端跨平台开发框架,在近几年得到众多开发者的认可.纵观现在接入RN的大厂,如qq音乐.菜鸟.去哪儿,无疑不是将RN作为重点技术栈进行研发. 不过,熟悉RN的开发者也知道, ...
最新文章
- 10-20国际电极标准系统
- KeeSoft.DBHelper.DBFactory 数据库访问类
- 使用Qt Assistant
- 构造 Codeforces Round #275 (Div. 2) C. Diverse Permutation
- 彻底学会使用epoll(一)——ET模式实现分析
- ScrollView与TableView实现选择效果
- centos7 mysql
- javascript---DOM---事件
- 算法笔记_面试题_2.移动零(将数组的的0元素移到末尾)
- 32位oracle_ORACLE如何优化代码将查询速度从5s提升到0.1s
- 事关美亚柏科未来发展!智慧城市建设注入新动力
- Class 'Qcloud\Sms\SmsSingleSender' not found
- python 图片分别保存至文件夹(深度学习图片数据集处理)
- 兄dei,作为程序员的你,这些一直接触的词都念对了吗?
- Windows 10做了这9项优化 电脑跑得比谁都快
- 飞凌嵌入式FETMX6Q-C
- 奇虎归来:周鸿祎讲的新故事能否弯道超车
- CPU相关的18个概念
- Matlab函数trainingOptions参数解析
- 忘记Mac管理员密码怎么办?