总结
方式 | 说明 |
---|---|
props |
props 一般适用于父子页面通过 navigation 导航时来传值RCTRootView 初始化时initialProperties 参数 |
NativeEventEmitter |
适用于native 向js 传值,也适用于js 向js 传值1)在 native 的Module 中指定事件名称2) js 端监听事件,并处理3) native 或者js 端触发事件并传递参数,执行到上述2)中的监听 |
RCTDeviceEventEmitter |
简单易用 |
mobxjs、redux
|
专业的应用程序状态管理库 |
props 传值
props
传值很简单,通常用于 navigation
父子页面间传值
NativeEventEmitter 传值
Native 声明支持 event
#import <Foundation/Foundation.h>
#import <React/RCTBridgeModule.h>
#import <React/RCTEventEmitter.h>
@interface TravelRNModule : RCTEventEmitter <RCTBridgeModule>
@end
@implementation TravelRNModule
- (NSArray<NSString *> *)supportedEvents
{
// 声明支持 `pageParameterEvent` 事件
return @[@"pageParameterEvent"];
}
@end
js 端监听事件
import React, { Component } from 'react';
import {
NativeEventEmitter,
EmitterSubscription,
NativeModules
} from 'react-native';
export default class MyComponent1 extends Component
{
nativeEventEmitter: NativeEventEmitter;
pageParameterEventSub: EmitterSubscription;
constructor(props)
{
super(props);
this.nativeEventEmitter = new NativeEventEmitter(NativeModules.TravelRNModule);
// 注册事件监听
this.pageParameterEventSub = this.nativeEventEmitter.addListener('pageParameterEvent', (parameters)=>{
// 接收事件参数并处理
console.log("receive native event: pageParameterEvent" + JSON.stringify(parameters));
});
}
}
native 端触发事件
[self sendEventWithName:@"pageParameterEvent" body:@{@"name": @"Troy"}];
js 端触发事件
import React, { Component } from 'react';
import {
NativeEventEmitter,
NativeModules
} from 'react-native';
export default class MyComponent2 extends Component
{
constructor(props)
{
super(props);
this.fireEvent = this.fireEvent.bind(this);
}
render()
{
return (
<TouchableOpacity onPress={()=>{this.fireEvent}}>
<Text>触发事件传值</Text>
</TouchableOpacity>
);
}
fireEvent()
{
let nativeEventEmitter = new NativeEventEmitter(NativeModules.TravelRNModule);
// 触发事件
nativeEventEmitter.emit("pageParameterEvent", {"name": "Troy"});
}
}
RCTDeviceEventEmitter
import RCTDeviceEventEmitter from 'RCTDeviceEventEmitter';
// 监听事件
RCTDeviceEventEmitter.addListener("userUpdatedEvent",(o)=>{
console.log(JSON.stringify(o));
});
// 触发事件
RCTDeviceEventEmitter.emit("userUpdatedEvent", {"name": "Troy Zhang"});
mobxjs
// 待续
网友评论