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

首頁 > 編程 > JavaScript > 正文

深入理解React Native原生模塊與JS模塊通信的幾種方式

2019-11-19 16:00:25
字體:
來源:轉載
供稿:網友

每種語言都有自己的設計理念、語法、運行環境,這也導致了不同語言間相互交流通信時必須要有中介來翻譯,如JAVA與C/C++通過JNI來交流、OC與C/C++需要在.mm文件混編、而JAVA/OC與Lua通信時需要通過C/C++語言來做中介。那么在React-Native中JSX是如何與底層模塊進行通信的呢?這里主要以iOS系統來做說明。

原理

通信本質上是信息的交流,具體到計算機語言則是數據的流動。應用中數據在React-Native與原生模塊間的流動與共享,完成了與用戶的交互,達成了應用的目標。React-Native與OC間通信的數據只能是下面的幾種類型(前為JS類型,后為OC類型):

  1. string-NSString
  2. number - int/NSInteger/float/double/NSNumber
  3. boolean - BOOL/NSNumber
  4. array - NSArray
  5. object - NSDictionary(NSString型key, value可以為這里的其它類型)
  6. func - RCTResponseSenderBlock

其它類型的數據需要通過一定的規則轉換成這幾種類型后(一般都會轉換成JSON串)再通信.

React-Native本質是通過JavaScriptCore.framework實現JS代碼與OC代碼間的互動。因此下面說的幾種方式在本質原理上都是相同的,不同的地方只是在于實現形式與方法的差別。

函數調用

在將原生模塊封裝并提供給React-Native使用時,可以通過RCT_EXPORT_METHOD()宏向React-Native側定義其可以調用的接口函數,完成兩模塊間的通信。

//定義了startVPN接口,React-Native將VPN的具體參數通過該接口傳入到原生模塊,開啟指定的VPNRCT_EXPORT_METHOD(startVPN:(NSDictionary*)config){ LSShadowSocksDataMode* mode = [[LSShadowSocksDataMode alloc] initWithDictionary:config]; [self.manager startVPN:mode];}

除了傳入數據外,通過可以通過這種方式從原生側獲取數據。最容易想到的是通過返回值獲取,可惜的是RCT_EXPORT_METHOD宏不支持返回值,不過其提供了另外一種實現返回值的方式:

RCT_EXPORT_METHOD(isOpen:(RCTResponseSenderBlock)callback){ BOOL open = [self.manager status]; callback(@[[NSNull null], @[@(open)]]);}

通過回調函數的形式實現返回值的效果,達到了數據交換的目的。

屬性共享

這種方式主要針對于UI控件來說的。React-Native中最基礎的UI類型是RCTRootView,該類有一個初始化方法initWithBridge:moduleName:initialProperties:,第三個參數initialProperties表示的是UI控件的初始屬性值,類型為NSDictionary,其最終會被同步到由第二個參數定義的React-Native類的props中,即完成了兩個模塊間的數據交流。

NSArray *imageList = @[@"http://foo.com/bar1.png",     @"http://foo.com/bar2.png"];NSDictionary *props = @{@"images" : imageList};RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge          moduleName:@"ImageBrowserApp"          initialProperties:props];
import React, { Component } from 'react';import { AppRegistry, View, Image,} from 'react-native';class ImageBrowserApp extends Component { renderImage(imgURI) { return (  <Image source={{uri: imgURI}} /> ); } render() { return (  <View>  {this.props.images.map(this.renderImage)}  </View> ); }}AppRegistry.registerComponent('ImageBrowserApp', () => ImageBrowserApp);

初始化接口只能在UI組件建立時使用,如果需要在UI組件的生命周期內通信呢,RCTRootView提供了appProperties這樣一種機制:

NSArray *imageList = @[@"http://foo.com/bar3.png",     @"http://foo.com/bar4.png"];rootView.appProperties = @{@"images" : imageList};

通知

OC中使用NSNotificationCenter向整個應用發送通知,所有對該通知感興趣的對象都會獲得該通知并執行相應的動作。

React-Native中也提供有類似的機制:RCTEventEmitter。原生模塊繼承該類后,就可以向React-Native側發送通知,而React-Native就能夠接收到該通知,并處理一并傳送過來的數據了。

-(void)vpnStatusChanged:(NSNotification*)notification{ NEVPNStatus status = [self.manager status]; NSString* value = nil; switch (status) { case NEVPNStatusReasserting:  value = @"重新連接中";  break; case NEVPNStatusConnecting:  value = @"連接中";  break; case NEVPNStatusConnected:  value = @"已連接";  break; case NEVPNStatusDisconnecting:  value = @"斷開連接中";  break; case NEVPNStatusDisconnected: case NEVPNStatusInvalid:  value = @"末連接";  break; default:  break;   } if(value){ [self sendEventWithName:@"VpnStatus" body:@{@"status":value}]; }}

這里將VPN的狀態通過通知發送到React-Native側,由React-Native將VPN的狀態顯示的UI界面上。

小結

這里只是簡單的介紹了兩種語言間幾種常用的通信方式,并沒有涉及到其背后的實現細節。對這方面感興趣的同學,不妨參閱下面的兩篇文章:

React Native通信機制詳解

淺析ReactNative之通信機制

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美一级片久久久久久久| 亚洲欧美在线一区| 91精品视频专区| 欧美日韩国产一区二区三区| 日韩电影中文字幕在线| 国产一区二区美女视频| 欧美精品中文字幕一区| 亚洲最大成人在线| 色婷婷亚洲mv天堂mv在影片| 亚洲成人激情在线| 日本sm极度另类视频| 国产精品极品美女在线观看免费| 亚洲精品动漫100p| 亚洲国产黄色片| 一区二区三区高清国产| 色哟哟亚洲精品一区二区| 国产欧美精品一区二区三区介绍| 精品久久久久久电影| 九九热精品视频国产| 亚洲伊人久久大香线蕉av| 欧美色道久久88综合亚洲精品| 日本电影亚洲天堂| 亚洲国产成人精品女人久久久| 91精品久久久久久久久久久久久久| 久久6精品影院| 欧美夫妻性生活xx| 国产精品麻豆va在线播放| 国产v综合ⅴ日韩v欧美大片| 色婷婷亚洲mv天堂mv在影片| 91沈先生作品| 国产精品自产拍在线观| 欧美激情精品久久久久久| 亚洲性生活视频在线观看| 欧美一区在线直播| 国产精品久久激情| 亚洲成人精品久久久| 欧美精品免费在线观看| 97人人爽人人喊人人模波多| 国产91在线播放精品91| 91视频国产一区| 精品国产精品三级精品av网址| 久热精品视频在线观看| 久久成人一区二区| 日韩在线视频导航| 亚洲电影免费观看高清完整版在线观看| 久久精品国产清自在天天线| 亚洲精品色婷婷福利天堂| 欧美裸体xxxxx| 欧美在线视频在线播放完整版免费观看| 亚洲欧洲国产一区| 国产91成人video| 2021久久精品国产99国产精品| 亚洲91av视频| 国产精品久久久久久久久久久新郎| 国产成人小视频在线观看| 欧美性猛交xxxxx免费看| 欧美黑人性生活视频| 91免费电影网站| 正在播放亚洲1区| 久久久久久久久久久人体| 欧美大胆在线视频| 青草热久免费精品视频| 日本欧美一级片| 日韩黄色在线免费观看| 97在线视频精品| 国产精品久久久久久久美男| 91麻豆国产精品| 成人免费观看49www在线观看| 国产成人精品久久久| 亚洲社区在线观看| 91精品久久久久久久久久另类| 成人黄色免费片| 麻豆成人在线看| 欧美成人免费全部| 狠狠色狠色综合曰曰| 成人国产精品一区二区| 在线视频亚洲欧美| 欧美一级视频免费在线观看| 日韩成人在线电影网| 高清视频欧美一级| 欧美大片免费观看在线观看网站推荐| 久久影视电视剧免费网站| 国产精品久久久av久久久| 欧美亚洲一级片| 国产福利视频一区| 精品视频—区二区三区免费| 欧美激情久久久久| 91国偷自产一区二区三区的观看方式| 91色视频在线导航| 亚洲一区二区三区四区视频| 日韩中文字幕在线精品| 久久香蕉国产线看观看av| 国产一区二区丝袜高跟鞋图片| 色综合老司机第九色激情| 亚洲最大av在线| 亚洲欧洲一区二区三区久久| 日本欧美国产在线| 国产精品aaaa| 一本色道久久88亚洲综合88| 久久国产精品久久国产精品| 欧美激情国内偷拍| 亚洲精品一区二区网址| 亚洲精品国产精品国自产在线| 国产精品久久在线观看| 91久久精品美女高潮| 亚洲免费人成在线视频观看| 久久国产精品久久久久久| 92看片淫黄大片看国产片| 亚洲高清一二三区| 欧美激情伊人电影| 国产91对白在线播放| 亚洲二区在线播放视频| 日韩欧美国产免费播放| 亚洲精品丝袜日韩| 亚洲精品在线91| 日本道色综合久久影院| xxxxx成人.com| 国产精品视频网址| 欧美一区三区三区高中清蜜桃| 最近2019免费中文字幕视频三| 欧美黑人性生活视频| 2019中文字幕在线| 国产极品精品在线观看| 亚洲精品福利视频| 91日本在线观看| 美女啪啪无遮挡免费久久网站| 亚洲japanese制服美女| 日韩女优人人人人射在线视频| 亚洲网站视频福利| 精品夜色国产国偷在线| 日韩在线免费视频观看| 亚洲а∨天堂久久精品9966| 国产精品视频区| 91视频国产精品| 色综合久久88色综合天天看泰| 亚洲国产精品久久久久秋霞蜜臀| 国产成人jvid在线播放| 亚洲成人精品久久久| 亚洲精品www久久久| 91高清视频免费观看| 欧美成人亚洲成人日韩成人| 欧美中文字幕第一页| 米奇精品一区二区三区在线观看| 中文字幕日韩欧美精品在线观看| 日韩av电影手机在线观看| 国产精品视频xxx| 国产精品白嫩美女在线观看| 91亚洲va在线va天堂va国| 欧美激情视频一区二区三区不卡| 97色伦亚洲国产| 欧美日韩国产区| 久久全国免费视频| 亚洲自拍小视频免费观看| 国产精品国产福利国产秒拍| 国产+成+人+亚洲欧洲| 91在线观看欧美日韩| 欧美日韩免费观看中文| 色综合久久中文字幕综合网小说| 亚洲网址你懂得| 日本欧美一级片| 欧美激情中文字幕乱码免费| 国产一区二区av| 精品久久久久久久久久久久久久| 亚洲欧洲偷拍精品|