RN和原生互調

 


OC 調 RN

https://blog.csdn.net/pz789as/article/details/52837853

https://blog.csdn.net/xiangzhihong8/article/details/75092576

https://blog.csdn.net/duyanglu/article/details/51203087




一、在OC代碼中 


1#import "RCTEventDispatcher.h" 

2@implementation @synthesize bridge = _bridge; 

3、在需要發佈事件的地方調用下面的函數:

_bridge.eventDispatcher sendDeviceEventWithName:(NSString*)eventName body:(id)bodyData


//eventName :事件的名字  bodyData:要傳遞的數據


二、JS代碼中 


1var RCTDeviceEventEmitter = require(‘RCTDeviceEventEmitter’);


2、在需要的地方訂閱事件。比如在組件掛載完成後訂閱:

componentDidMount: function() {

    this.subscription = RCTDeviceEventEmitter.addListener('orientationDidChange',(dimensions) => {

      console.log(dimensions);

    })

  },


3、記得移除訂閱


componentWillUnMount: function() {

    this.subscription.remove();

  },


使用bridge.eventDispatche攔截消息時,有三分方法需要注意。

  • sendAppEventWithName
  • sendDeviceEventWithName
  • sendInputEventWithName 


然後在JS那邊也有三個對應的接收接口。


  • RCTAppEventEmitter
  • RCTDeviceEventEmitter
  • RCTInputEventEmitter

 



2 RN 調 OC


https://www.jianshu.com/p/308357ffe7c5


https://blog.csdn.net/horisea/article/details/54176417


https://blog.csdn.net/horisea/article/details/54176417


https://www.jianshu.com/p/1f67628ef214



 



React Native中,一個“原生模塊”就是一個實現了“RCTBridgeModule”協議的


oc代碼:

———————————————————————————————————————


#import <Foundation/Foundation.h>

 #import <RCTBridgeModule.h> 

@interface NativeTest : NSObject<RCTBridgeModule> 

@end 


#import "NativeTest.h" 

@implementation NativeTest 

//注意:爲了實現RCTBridgeModule協議,你的類需要包含RCT_EXPORT_MODULE()宏 

RCT_EXPORT_MODULE(); 

//此處不添加參數即默認爲這個OC類的名字 //導出方法,橋接到js的方法返回值類型必須是 void


RCT_EXPORT_METHOD(doSomething:(NSString *)name)

    NSLog(@"doSomething:%@",name); 

}


 @end



js代碼:

———————————————————————————————————————


import {

  NativeModules,

  NativeAppEventEmitter

} from 'react-native';


/**

 * [RN調用原生]

 */

var myNativeTest = NativeModules.NativeTest;

class myRNClass extends React.Component {

  render() {

    return (

          <TouchableHighlight onPress={ ()=>myNativeTest.doSomething('test')}>

            <Text style={styles.text}>

            點擊

            </Text>

          </TouchableHighlight>

    );

  }

}



———————————————————————————————————————

———————————————————————————————————————


oc代碼:

RCT_EXPORT_METHOD(doOther:(NSString *)name callback:(RCTResponseSenderBlock)callback)

{

    NSLog(@"doOther:");

    NSArray *array = @[@"abc",@"acb"];

    callback(@[[NSNull null],array]);

}

———————————————————————————————————————


 js代碼:


/**

 * 傳參數並帶有回調

 */

class myRNTest extends React.Component {

  render() {

    return (

          <TouchableHighlight onPress={ ()=>{myNativeTest.doOther(

            'test',(error,events)=>{

              if (error) {

                console.error(error);

              }else {

                console.log('傳值成功');

                this.setState({events:events});

              }

            }

            )}}>

            <Text style={styles.text}>

            點擊

            </Text>

          </TouchableHighlight>

    );

  }

}

 


———————————————————————————————————————

———————————————————————————————————————


任何RCTConvert類支持的的類型也都可以使用

RCTConvert還提供了一系列輔助函數,用來接收一個JSON值並轉換到原生Objective-C類型或類.



#import "RCTConvert.h"

#import "RCTBridge.h"

#import "RCTEventDispatcher.h"

//  對外提供調用方法,爲了演示事件傳入屬性字段

RCT_EXPORT_METHOD(testDictionaryEvent:(NSString *)name details:(NSDictionary *) dictionary)

{

    NSString *location = [RCTConvert NSString:dictionary[@"thing"]];

    NSDate *time = [RCTConvert NSDate:dictionary[@"time"]];

    

    NSString *info = [NSString stringWithFormat:@"Test: %@\nFor: %@\nTestTime: %@",name,location,time];

    NSLog(@"%@", info);

}


 











發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章