亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

React Native自定義組件與輸出方法詳解

2019-10-21 18:40:47
字體:
來源:轉載
供稿:網友

簡介

如果你看的這一篇,需要你對ReactNative的開發有一定的了解,此文講的是在ReactNative提供的組件不能滿足需求,或者native用于較成熟的組件想要輸出,那么就需要用到自定義組件了.

通過該文,我們也可以對native和JS交互方式進行初步了解,關于輸出方法內部實現,我們下一篇再剖.

Native module

native module就是實現了RCTBridgeModule協議的OC類.RCT就是ReaCT的縮寫.

具體步驟如下

  • 引入#import <React/RCTBridgeModule.h>類,然后遵守RCTBridgeModule協議.
  • 實現RCT_EXPORT_MODULE(customName)方法. customName是自定義的組件名,如果不填默認為當前類名.這個組件名是用于向JS輸出.

輸出組建后,默認不會向JS輸出任何方法,想要輸出方法,需要自定義實現方法輸出,使用宏RCT_EXPORT_METHOD ()

RCT_EXPORT_METHOD(addEvent:(NSString *)name location:(NSString *)location){ RCTLogInfo(@"Pretending to create an event %@ at %@", name, location);}

對于JS端,調用時就可以如下

import {NativeModules} from 'react-native';var CustomName = NativeModules.CalendarManager;CustomName.addEvent('Birthday Party', '4 Privet Drive, Surrey');

注意

向JS輸出的方法名,是RCT_EXPORT_METHOD之后,第一個冒號之前的名字.如果native已經暴露了多個冒號之前同名的方法,RN提供了RCT_REMAP_METHOD ()來制定方法名.

另外一點, RCT_EXPORT_METHOD回調進入的方法,默認并不在主線程,如果想要進行主線程的方法調用,需要手動進行dispatch_async(dispatch_get_main_queue(), ^{});回到主線程

RCT_EXPORT_METHOD參數

RCT_EXPORT_METHOD支持如下的參數類型

  • string (NSString)
  • number (NSInteger, float, double, CGFloat, NSNumber)
  • boolean (BOOL, NSNumber)
  • array (NSArray) of any types from this list
  • object (NSDictionary) with string keys and values of any type from this list
  • function (RCTResponseSenderBlock)

也支持所有RCTConvert支持的類型.

回調

native module支持回調類型RCTResponseSenderBlock

RCT_EXPORT_METHOD(findEvents:(RCTResponseSenderBlock)callback){ NSArray *events = ... callback(@[[NSNull null], events]);}

RCTResponseSenderBlock只支持一個參數:一個包含了多個參數的數組.在JS端可以如下,默認第一個參數是error.當沒有錯誤時error為空.

CalendarManager.findEvents((error, events) => { if (error) { console.error(error); } else { this.setState({events: events}); }});

native module只能調用一次回調.如果想傳遞錯誤,通過RCTUtils.h類中的RCTMakeError來創建.

Promise

Promise是用于實現異步操作async/await的工具類.如果最后一個參數類型為RCTPromiseResolveBlock和RCTPromiseRejectBlock,JS端會返回一個promise對象,進行一步操作.

RCT_REMAP_METHOD(findEvents,     findEventsWithResolver:(RCTPromiseResolveBlock)resolve     rejecter:(RCTPromiseRejectBlock)reject){ NSArray *events = ... if (events) { resolve(events); } else { NSError *error = ... reject(@"no_events", @"There were no events", error); }}

JS端因為獲取的是promise對象,可以使用await關鍵字進行異步調用并等待結果

async function updateEvents() { try { var events = await CalendarManager.findEvents(); this.setState({events}); } catch (e) { console.error(e); }}updateEvents();

關于線程

JS執行native module是在一個單獨的線程實現的,可以通過- (dispatch_queue_t)methodQueue來控制.如果返回主線程,所有執行的方法會在主線程被執行.

- (dispatch_queue_t)methodQueue{ return dispatch_get_main_queue();}

方法methodQueue之后在組件初始化時被調用一次.

輸出實例

除了可以輸出方法,還有輸出實例.

- (NSDictionary *)constantsToExport{ return @{ @"firstDayOfTheWeek": @"Monday" };}

在JS端可以直接獲取console.log(CalendarManager.firstDayOfTheWeek);

只有在初始化時實例輸出才是有效的,如果在運行時修改constantsToExport是不會影響JS環境的數據的.

輸出枚舉

通過typedef NS_ENUM()定義的枚舉,可以通過增加RCTConvert的擴展來完成

@implementation RCTConvert (StatusBarAnimation) RCT_ENUM_CONVERTER(UIStatusBarAnimation, (@{ @"statusBarAnimationNone" : @(UIStatusBarAnimationNone),            @"statusBarAnimationFade" : @(UIStatusBarAnimationFade),            @"statusBarAnimationSlide" : @(UIStatusBarAnimationSlide)}),      UIStatusBarAnimationNone, integerValue)@end

之后就可以通過輸出屬性和方法等方式在JS中使用了.

native向JS發方法

想給JS發方法,可以繼承類RCTEventEmitter,實現supportedEvents方法,然后通過調用self sendEventWithName:即可.

RCT_EXPORT_MODULE();- (NSArray<NSString *> *)supportedEvents{ return @[@"EventReminder"];}- (void)calendarEventReminderReceived:(NSNotification *)notification{ NSString *eventName = notification.userInfo[@"name"]; [self sendEventWithName:@"EventReminder" body:@{@"name": eventName}];}

JS端可以通過NativeEventEmitter進行注冊和調用

import { NativeEventEmitter, NativeModules } from 'react-native';const { CalendarManager } = NativeModules;const calendarManagerEmitter = new NativeEventEmitter(CalendarManager);const subscription = calendarManagerEmitter.addListener( 'EventReminder', (reminder) => console.log(reminder.name));...// Don't forget to unsubscribe, typically in componentWillUnmountsubscription.remove();

注意取消訂閱,一般在componentWillUnmount內執行.

客戶端可以通過一些方式獲取JS注冊和移除訂閱的事件,來優化只在有訂閱者的情況下才發送事件.

// Will be called when this module's first listener is added.-(void)startObserving { hasListeners = YES; // Set up any upstream listeners or background tasks as necessary}// Will be called when this module's last listener is removed, or on dealloc.-(void)stopObserving { hasListeners = NO; // Remove upstream listeners, stop unnecessary background tasks}

資料

native modules官文

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到IOS開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美中文日韩在线v日本| 久久久久女教师免费一区| 亚洲电影免费观看高清| 欧美福利视频在线观看| 精品亚洲一区二区| 国产精品视频不卡| 亚洲人午夜精品| 国内精品视频久久| 亚洲直播在线一区| 91久久国产综合久久91精品网站| 国产成人精品在线| 中文字幕成人精品久久不卡| 国产精品入口夜色视频大尺度| 宅男66日本亚洲欧美视频| 538国产精品一区二区免费视频| 国产日韩精品在线播放| 91精品国产91久久久久| 久久男人的天堂| 欧美成aaa人片在线观看蜜臀| 日本成人黄色片| 国产成人在线视频| 欧美成人免费va影院高清| 色青青草原桃花久久综合| 日韩av电影国产| 精品国产成人在线| 亚洲精品久久久久久久久久久久| 国产精品福利无圣光在线一区| 91精品国产综合久久香蕉的用户体验| 国模gogo一区二区大胆私拍| 欧美精品激情blacked18| 国产亚洲欧洲黄色| 欧美老肥婆性猛交视频| 黑人与娇小精品av专区| 国产日韩欧美在线看| 日韩成人高清在线| 欧美激情视频在线观看| 亚洲国产日韩欧美在线99| 51精品在线观看| 91国产精品视频在线| 欧美成人午夜剧场免费观看| 久久免费福利视频| 欧美一级bbbbb性bbbb喷潮片| 成人精品视频久久久久| 日韩最新在线视频| 成人免费观看a| 日韩高清电影免费观看完整版| 亚洲福利在线看| 国产精品一区二区性色av| 国产精品视频精品视频| 欧美高清在线视频观看不卡| 亚洲性无码av在线| 亚洲sss综合天堂久久| 日韩一级黄色av| 国产精品自产拍在线观看中文| 欧美成人免费播放| 九九综合九九综合| 九色成人免费视频| 国产婷婷成人久久av免费高清| 97色在线播放视频| 亚洲欧美日韩成人| 一区二区三区在线播放欧美| 日韩久久免费视频| 日韩一区二区精品视频| 日韩av一区在线观看| 97在线精品国自产拍中文| 亚洲国产毛片完整版| 另类天堂视频在线观看| 一个人看的www久久| 日韩av在线精品| 精品国产一区二区三区在线观看| 超碰97人人做人人爱少妇| 亚洲精品美女视频| 国产精品久久久久久av福利软件| 久久韩剧网电视剧| 国产色婷婷国产综合在线理论片a| 在线观看日韩视频| 日韩欧美主播在线| 亚洲美女在线看| 日本中文字幕成人| 奇米4444一区二区三区| 亚洲精品永久免费精品| 川上优av一区二区线观看| 国产福利精品在线| 欧美性猛交xxxxx免费看| 日韩精品中文在线观看| 疯狂蹂躏欧美一区二区精品| 久久精品国产91精品亚洲| 亚洲毛片在线免费观看| 亚洲成人精品视频在线观看| 日韩av影片在线观看| 欧美亚洲午夜视频在线观看| 欧美性猛交xxxx乱大交| 亚洲精品视频在线观看视频| 国产精品自产拍高潮在线观看| 秋霞av国产精品一区| 成人福利网站在线观看| 亚洲电影在线看| 91久久久久久国产精品| 欧美日韩国产色| 国内精久久久久久久久久人| 日韩亚洲国产中文字幕| 亚洲视频专区在线| 91成品人片a无限观看| 88国产精品欧美一区二区三区| 欧美成人精品在线视频| 国产精品欧美激情在线播放| 亚洲一区二区三区成人在线视频精品| 亚洲乱码国产乱码精品精| 成人国产在线视频| zzjj国产精品一区二区| 欧美自拍大量在线观看| 亚洲国产天堂久久综合网| 啪一啪鲁一鲁2019在线视频| 精品福利在线看| 黄色成人在线免费| 国产精品一区二区性色av| 国产精品日韩精品| 中文字幕欧美视频在线| 亚洲白虎美女被爆操| 国模gogo一区二区大胆私拍| 日韩成人激情在线| 欧美日韩中文字幕综合视频| 日韩电影中文 亚洲精品乱码| 欧美日韩在线一区| 亚洲免费视频网站| 亚洲3p在线观看| 欧美猛少妇色xxxxx| 国产精品白嫩初高中害羞小美女| 国产一区二区三区精品久久久| 98精品国产自产在线观看| 久久艳片www.17c.com| 中文字幕日韩免费视频| 国产精品美女免费| www.亚洲成人| 欧美极度另类性三渗透| 中文字幕在线精品| 亚洲一区二区三区四区在线播放| 色婷婷综合久久久久中文字幕1| 中文字幕亚洲欧美在线| 欧美裸体xxxx极品少妇软件| 俺去亚洲欧洲欧美日韩| 国产网站欧美日韩免费精品在线观看| 国产欧美一区二区三区久久| 亚洲jizzjizz日本少妇| 欧洲亚洲免费视频| 久久久久久久av| 久久久久久免费精品| 波霸ol色综合久久| 欧美日韩一区二区在线| 久久亚洲精品一区二区| 亚洲精品999| 日韩国产在线播放| 国产精品免费福利| 国产精品亚洲精品| 永久免费毛片在线播放不卡| 久久久久久久国产精品| 国产国语videosex另类| 国产精品一久久香蕉国产线看观看| 国产午夜精品理论片a级探花| 日本精品在线视频| 国产精品嫩草影院久久久| 亚洲精品免费在线视频| 成人在线观看视频网站| 亚洲福利在线播放|