最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2018年07月06日 15:35:04   作者:sea_biscute  
這篇文章主要給大家介紹了關(guān)于React Native自定義組件與輸出方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

簡介

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

通過該文,我們也可以對native和JS交互方式進(jìn)行初步了解,關(guān)于輸出方法內(nèi)部實(shí)現(xiàn),我們下一篇再剖.

Native module

native module就是實(shí)現(xiàn)了RCTBridgeModule協(xié)議的OC類.RCT就是ReaCT的縮寫.

具體步驟如下

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

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

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

對于JS端,調(diào)用時就可以如下

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

注意

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

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

RCT_EXPORT_METHOD參數(shù)

RCT_EXPORT_METHOD支持如下的參數(shù)類型

  • 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支持的類型.

回調(diào)

native module支持回調(diào)類型RCTResponseSenderBlock

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

RCTResponseSenderBlock只支持一個參數(shù):一個包含了多個參數(shù)的數(shù)組.在JS端可以如下,默認(rèn)第一個參數(shù)是error.當(dāng)沒有錯誤時error為空.

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

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

Promise

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

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端因?yàn)楂@取的是promise對象,可以使用await關(guān)鍵字進(jìn)行異步調(diào)用并等待結(jié)果

async function updateEvents() {
 try {
 var events = await CalendarManager.findEvents();

 this.setState({events});
 } catch (e) {
 console.error(e);
 }
}

updateEvents();

關(guān)于線程

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

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

方法methodQueue之后在組件初始化時被調(diào)用一次.

輸出實(shí)例

除了可以輸出方法,還有輸出實(shí)例.

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

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

只有在初始化時實(shí)例輸出才是有效的,如果在運(yùn)行時修改constantsToExport是不會影響JS環(huán)境的數(shù)據(jù)的.

輸出枚舉

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

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

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

native向JS發(fā)方法

想給JS發(fā)方法,可以繼承類RCTEventEmitter,實(shí)現(xiàn)supportedEvents方法,然后通過調(diào)用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進(jìn)行注冊和調(diào)用

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 componentWillUnmount
subscription.remove();

注意取消訂閱,一般在componentWillUnmount內(nèi)執(zhí)行.

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

// 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官文

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • ReactJS中使用TypeScript的方法

    ReactJS中使用TypeScript的方法

    TypeScript 實(shí)際上就是具有強(qiáng)類型的 JavaScript,可以對類型進(jìn)行強(qiáng)校驗(yàn),好處是代碼閱讀起來比較清晰,代碼類型出現(xiàn)問題時,在編譯時就可以發(fā)現(xiàn),而不會在運(yùn)行時由于類型的錯誤而導(dǎo)致報錯,這篇文章主要介紹了ReactJS中使用TypeScript的方法,需要的朋友可以參考下
    2024-04-04
  • React使用highlight.js Clipboard.js實(shí)現(xiàn)代碼高亮復(fù)制

    React使用highlight.js Clipboard.js實(shí)現(xiàn)代碼高亮復(fù)制

    這篇文章主要為大家介紹了React使用highlight.js Clipboard.js實(shí)現(xiàn)代碼高亮復(fù)制功能示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • React ant 點(diǎn)擊導(dǎo)航條閃爍問題解決

    React ant 點(diǎn)擊導(dǎo)航條閃爍問題解決

    很多小伙伴反饋React ant 點(diǎn)擊導(dǎo)航條閃爍,沒有傳遞具體的參數(shù)給點(diǎn)擊事件 , 導(dǎo)致在函數(shù)內(nèi)部無法準(zhǔn)確判斷要展示哪個子菜單,可能導(dǎo)致頁面狀態(tài)的短暫變化,出現(xiàn)閃爍效果,下面給大家分享解決方法,感興趣的的朋友跟隨小編一起看看吧
    2024-04-04
  • React中控制子組件顯示隱藏的兩種方式及對比詳解

    React中控制子組件顯示隱藏的兩種方式及對比詳解

    在 react 中,如果我們想控制子組件的顯示和隱藏一般有兩種方式,一種是父組件維護(hù)子組件顯示隱藏狀態(tài),另一種則是通過 forwardRef 直接設(shè)置子組件的狀態(tài)進(jìn)行維護(hù),這兩種方式各有優(yōu)缺點(diǎn),以及對于不同的使用場景不同,今天我們就來簡單討論下,需要的朋友可以參考下
    2025-04-04
  • 關(guān)于React Native 無法鏈接模擬器的問題

    關(guān)于React Native 無法鏈接模擬器的問題

    許多朋友遇到React Native 無法鏈接模擬器的問題,怎么解決呢,本文給大家分享完整簡便解決方法及配置例題,對React Native 鏈接模擬器相關(guān)知識感興趣的朋友一起看看吧
    2021-06-06
  • 詳解在React項(xiàng)目中如何集成和使用web worker

    詳解在React項(xiàng)目中如何集成和使用web worker

    在復(fù)雜的React應(yīng)用中,某些計(jì)算密集型或耗時操作可能會阻塞主線程,導(dǎo)致用戶界面出現(xiàn)卡頓或響應(yīng)慢的現(xiàn)象,為了優(yōu)化用戶體驗(yàn),可以采用Web Worker來在后臺線程中執(zhí)行這些操作,本文將詳細(xì)介紹在React項(xiàng)目中如何集成和使用Web Worker來改善應(yīng)用性能,需要的朋友可以參考下
    2023-12-12
  • 淺談react+es6+webpack的基礎(chǔ)配置

    淺談react+es6+webpack的基礎(chǔ)配置

    下面小編就為大家?guī)硪黄獪\談react+es6+webpack的基礎(chǔ)配置。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • 詳解React setState數(shù)據(jù)更新機(jī)制

    詳解React setState數(shù)據(jù)更新機(jī)制

    這篇文章主要介紹了React setState數(shù)據(jù)更新機(jī)制的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用React框架,感興趣的朋友可以了解下
    2021-04-04
  • React?Native與iOS?OC之間的交互示例詳解

    React?Native與iOS?OC之間的交互示例詳解

    這篇文章主要為大家介紹了React?Native與iOS?OC之間的交互示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • React組件中監(jiān)聽函數(shù)獲取不到最新的state問題

    React組件中監(jiān)聽函數(shù)獲取不到最新的state問題

    這篇文章主要介紹了React組件中監(jiān)聽函數(shù)獲取不到最新的state問題問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01

最新評論

乌拉特中旗| 镇赉县| 阜宁县| 麻江县| 阿克苏市| 广南县| 琼中| 平乐县| 时尚| 阿巴嘎旗| 光山县| 衡阳县| 全州县| 安徽省| 静宁县| 从化市| 全南县| 新泰市| 阳泉市| 青川县| 晋州市| 望都县| 怀化市| 木兰县| 五华县| 白水县| 洪江市| 龙陵县| 达尔| 隆安县| 普陀区| 鹤山市| 股票| 龙口市| 万盛区| 启东市| 当涂县| 龙岩市| 土默特左旗| 潼关县| 朔州市|