React-Native新版本RCTEventEmitter的使用(从原生发送消息到JS)
来源:互联网 发布:mac的ip地址怎么看 编辑:程序博客网 时间:2024/06/06 18:54
参考:http://blog.csdn.net/pz789as/article/details/52837853
记得在0.27版本之前,RN的文档里面就告诉了我们怎么从Native端主动发消息到JS端,上面说的方式是这样的:
@synthesize bridge = _bridge;-(void)iseCallback:(NSString*)code result:(NSString*) result{ [_bridge.eventDispatcher sendDeviceEventWithName:@"iseCallback" body:@{ @"code":code, @"result":result, @"index":self.bridgeIndex, @"category":self.bridgeCategory }];}
然后JS那边调用:
import RCTDeviceEventEmitter from 'RCTDeviceEventEmitter';this.listener = myNativeEvt.addListener('iseCallback', this.iseCallback.bind(this));this.listener && this.listener.remove();
直接使用bridge.eventDispatcher中的方法,里面有三个,分别是:
sendAppEventWithName
sendDeviceEventWithName
sendInputEventWithName
然后在JS那边也有三个对应的接收接口
RCTAppEventEmitter
RCTDeviceEventEmitter
RCTInputEventEmitter
虽然目前都可以使用,但是在xcode里面一直提示这种方式可能要被取代:
'sendDeviceEventWithName:body:' is deprecated: Subclass RCTEventEmitter instead
然后文档也没见到新方式的例子。
到目前为止,RN的 中文文档 和 英文原文文档 都没有看到,于是就去RN的github上找答案,结果上面有人已经提了。做法是这样的:
原生端修改:
1、自定义的模块类头文件要继承自RCTEventEmitter
#import "RCTEventEmitter.h"@interface ChivoxISE : RCTEventEmitter<RCTBridgeModule>
- (NSArray<NSString *> *)supportedEvents{ return @[@"iseCallback", @"iseVolume", @"playCallback"];//有几个就写几个}
3、分别实现你导出的所有方法,里面都使用 sendEventWithName 方法即可
-(void)iseCallback:(NSString*)code result:(NSString*) result{ [self sendEventWithName:@"iseCallback" body:@{ @"code": code, @"result": result, }];}
4、最后JS端调用
import { ... NativeModules, NativeEventEmitter, //导入NativeEventEmitter模块} from 'react-native';var ChivoxISE = NativeModules.ChivoxISE;const myNativeEvt = new NativeEventEmitter(ChivoxISE); //创建自定义事件接口//在组件中使用 componentWillMount() { this.listener = myNativeEvt.addListener('iseCallback', this.iseCallback.bind(this)); //对应了原生端的名字 } componentWillUnmount() { this.listener && this.listener.remove(); //记得remove哦 this.listener = null; }
iseCallback(data) {//接受原生传过来的数据 data={code:,result:} if (data.code == CB_CODE_RESULT) { // } else {//..真的是未知的错误 logf('传回其他参数', data.result); } }
5、结束。O(∩_∩)O哈哈~
2 0
- React-Native新版本RCTEventEmitter的使用(从原生发送消息到JS)
- 从React Native 跳转到原生页面
- React Native原生模块的基本使用
- 从Android到React Native开发(三、自定义原生控件支持)
- IOS-React Native 使用CocoaPods集成到原生项目中
- 从 React到React Native
- react native使用原生模块
- React Native使用原生组件
- react native使用原生模块
- react native (五)嵌入到原生应用
- React Native移植到原生Android项目
- React Native集成到原生项目(IOS)
- React Native嵌入到现有原生应用
- React Native集成到原生项目示例
- React Native 集成到原生项目(iOS)
- React Native 集成到原生项目(iOS)
- Android原生到React Native移植
- React Native 嵌入到iOS原生应用
- Java POI Excel导出文件名中文乱码
- Java8 - LinkedList源码
- iOS10 Xcode8运行时上下黑边的解决办法
- iOS OS X EL Capitan安装CocoaPods遇过的坑
- 数据结构--C语言实现栈的顺序存储结构
- React-Native新版本RCTEventEmitter的使用(从原生发送消息到JS)
- webservice接口应用
- java回调机制
- Java的三大平台
- java开发学习中用到的工具,网站
- node小爬虫(cheerio相当于jq)
- 第七周项目—四则运算
- Linux里守护进程的三言两语
- Hibernate关联关系之一对多