摘要:是的縮寫,中相關(guān)的命名均以開頭。引入是用來定義被調(diào)用的方法的宏。的代碼實現(xiàn)它的作用是在定義的下面,定義一個可以被調(diào)用的方法。比如我們在中定義一個方法,該方法接收參數(shù)關(guān)閉這里使用直接把中的值轉(zhuǎn)換為在中的調(diào)用方法源代碼地址
React Native在設(shè)計之初,就考慮到了React Native提供的API,不能夠完全的覆蓋平臺對應(yīng)的所有API.因此在React Native中可以方便的調(diào)用Native的方法,Android上面對應(yīng)Java方法,IOS上對應(yīng)Object-C方法。
有的時候在處理數(shù)據(jù)庫,多線程上面,使用Native加的方便。
下面就以調(diào)用IOS系統(tǒng)的Alert為例,看下怎么使用JavaScript代碼調(diào)用Object-C的Native方法的。
RCT是ReaCT的縮寫,React Native中Object-C相關(guān)的命名均以RCT開頭。
RCTBridgeModule是定義好的protocol,實現(xiàn)該協(xié)議的類,會自動注冊到Object-C對應(yīng)的Bridge中。
Object-C Bridge上層負責(zé)與Object-C通信,下層負責(zé)和JavaScript Bridge通信,而JavaScript Bridge負責(zé)和JavaScript通信.
這樣,通過Object-C Bridge和JavaScript Bridge就可以實現(xiàn)JavaScript和Object-C的相互調(diào)用。
先要定義一個類:RNIOSAlert用來現(xiàn)實RCTBridgeModule協(xié)議。
#importRCT_EXPORT_MODULE#import #import "RCTBridgeModule.h" @interface RNIOSAlert : NSObject @end
所有實現(xiàn)RCTBridgeModule的類都必須顯示的include宏命令:RCT_EXPORT_MODULE()。
RCT_EXPORT_MODULE的作用是:自動注冊一個Module,當Object-c Bridge加載的時候。這個Module可以在JavaScript Bridge中調(diào)用。
RCT_EXPORT_MODULE宏命令的定義:
#define RCT_EXPORT_MODULE(js_name) RCT_EXTERN void RCTRegisterModule(Class); + (NSString *)moduleName { return @#js_name; } + (void)load { RCTRegisterModule(self); }
可以看到RCT_EXPORT_MODULE接受字符串作為其Module的名稱,如果不設(shè)置名稱的話默認就使用類名作為Modul的名稱。
引入RCT_EXPORT_MODULE:
#import "RNIOSAlert.h" @implementation RNIOSAlert RCT_EXPORT_MODULE(); @endRCT_EXPORT_METHOD
RCT_EXPORT_METHOD是用來定義被JavaScript調(diào)用的方法的宏。RCT_EXTERN_METHOD調(diào)用了宏RCT_EXTERN_REMAP_METHOD,最終調(diào)用宏RCT_EXTERN_REMAP_METHOD。
RCT_EXTERN_REMAP_METHOD的代碼實現(xiàn):
#define RCT_EXTERN_REMAP_METHOD(js_name, method) ? + (NSArray*)RCT_CONCAT(__rct_export__, ? ? RCT_CONCAT(js_name, RCT_CONCAT(__LINE__, __COUNTER__))) { ? ? return @[@#js_name, @#method]; ? }
它的作用是在RCT_EXPORT_MODULE定義的Module下面,定義一個可以被JavaScript調(diào)用的方法。
RCT_EXPORT_MODULE的使用,需要寫入方法名,參數(shù)以及完整的實現(xiàn),例如:
#import "RNIOSAlert.h" @implementation RNIOSAlert RCT_EXPORT_MODULE(); RCT_EXPORT_METHOD(show:(NSString *)msg){ ? UIAlertView * alertView=[[UIAlertView alloc] initWithTitle:@"react-native" message:msg delegate:nil cancelButtonTitle:@"關(guān)閉" otherButtonTitles:nil, nil]; ? ? [alertView show]; } @endJavaScript調(diào)用
在JavaScript中調(diào)用Object-C定義的方法,需要先導(dǎo)入NativeModules,再使用RNIOSAlert:
完整代碼如下:
import {? ? ? ? StyleSheet, ? ? Text, ? ? View, ? ? NativeModules, ? ? TouchableOpacity } from "react-native"; var RNIOSAlert = NativeModules.RNIOSAlert; class RNIos extends Component { ? ? render() { ? ? ? ? return ( ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ); ? ? } }RNIOSAlert.show("from react native ")}> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Alert ? ? ? ? ? ? ? ?
成功調(diào)用Alert:
參數(shù)RCT_EXPORT_METHOD支持需要JSON所支持的數(shù)據(jù)類型,JavaScript中的參數(shù)與Object-C的參數(shù)的對應(yīng)關(guān)系。
string -> NSString
number -> (NSInteger,float,double,CGFloat,NSNumber)
boolean -> (BOOL,NSNumber)
array -> NSArray
object -> NSDictionary
function -> RCTResponseSenderBlock
另外React Navite還提供了RCTConvert,詳情的代碼可以參照 https://github.com/facebook/react-native/blob/master/React/Base/RCTConvert.h,他的作用可以把傳入的參數(shù)轉(zhuǎn)換為需要的數(shù)據(jù)類型。
比如我們在Object-C中定義一個方法,該方法接收NSDictionary參數(shù):
RCT_EXPORT_METHOD(showTime:(NSDictionary*)dict){ ? NSDate * date =[RCTConvert NSDate:dict[@"time"]]; ? UIAlertView * alertView=[[UIAlertView alloc] initWithTitle:@"react-native" message:[date description] delegate:nil cancelButtonTitle:@"關(guān)閉" otherButtonTitles:nil, nil]; ? [alertView show]; ? }
這里使用RCTConvert直接把NSDictionary中的值轉(zhuǎn)換為NSDate.
在JavaScript中的調(diào)用showTime方法:
......{ ? ? ? ? ? ? ? ? ? ? var date = new Date(); ? ? ? ? ? ? ? ? ? ? RNIOSAlert.showTime( ? ? ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? ? ? time: date.getTime() ? ? ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? ) ? ? ? ? ? ? ? ? }}> ? ? ? ? ? ? ? ? ? ? ......Time ? ? ? ? ? ? ? ?
源代碼地址:https://github.com/jjz/react-...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/91649.html
摘要:但阿里百川并沒有提供直接獲取數(shù)據(jù)的方法,所以選擇時一定要慎重。 React-native 使用native第三方sdk ios(以阿里百川用戶反饋為例) 首先安裝cocopods(類似于npm,ios開發(fā)的依賴管理工具,教程:http://www.code4app.com/artic... 在ios根目錄下創(chuàng)建Podfile文件,添加如下代碼(使用的是百川feedback1.1.1版...
摘要:在版本上,安卓系統(tǒng)上的渲染就有鋸齒,后來我們不分效果是使用圖片實現(xiàn)的,汗啊第三方組件不全。搖一搖問題的解決在我們使用了等狀態(tài)管理時,熱更新不會更新這些代碼,而頻繁搖一搖實在是太累了。此時可以使用此時相當于虛擬了一個搖一搖事件。 公司本年度有App任務(wù),陸陸續(xù)續(xù)用RN開發(fā)了兩個應(yīng)用。一款是涉及儀器控制的平板項目,另一款是客戶端的App。下文談?wù)勈褂肦N開發(fā)的部分認知(其實只是隨便扯一扯,...
閱讀 2844·2021-09-10 10:50
閱讀 2199·2019-08-29 16:06
閱讀 3205·2019-08-29 11:02
閱讀 1104·2019-08-26 14:04
閱讀 2816·2019-08-26 13:24
閱讀 2311·2019-08-26 12:16
閱讀 557·2019-08-26 10:29
閱讀 3104·2019-08-23 18:33