欧美精品在线一区二区三区_亚洲女同精品视频_日韩一区免费_国产欧美久久久精品免费_国产这里只有精品_僵尸再翻生在线观看_久久99精品国产一区二区三区_亚洲免费一区二区_女教师淫辱の教室蜜臀av软件_中文字幕国产一区二区

React Native原生與JS層交互

2018-7-2    seo達人

如果您想訂閱本博客內容,每天自動發到您的郵箱中, 請點這里

最近在對《React Native移動開發實戰》一書進行部分修訂和升級。在React Native開發中,免不了會涉及到原生代碼與JS層的消息傳遞等問題,那么React Native究竟是如何實現與原生的互相操作的呢?

原生給React Native傳參

原生給React Native傳值

原生給JS傳值,主要依靠屬性,也就是通過initialProperties,這個RCTRootView的初始化函數的參數來完成。通過RCTRootView的初始化函數你可以將任意屬性傳遞給React Native應用,參數initialProperties必須是NSDictionary的一個實例。RCTRootView有一個appProperties屬性,修改這個屬性,JS端會調用相應的渲染方法。

使用RCTRootView將React Natvie視圖封裝到原生組件中。RCTRootView是一個UIView容器,承載著React Native應用。同時它也提供了一個聯通原生端和被托管端的接口。

例如有下面一段OC代碼:

NSURL *jsCodeLocation;

  jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index.ios" fallbackResource:nil]; NSArray *imageList = @[@"http://foo.com/bar1.png",
                         @"http://foo.com/bar2.png"]; NSDictionary *wjyprops = @{@"images" : imageList};

  RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation
                                                      moduleName:@"ReactNativeProject" initialProperties:wjyprops
                                                   launchOptions:launchOptions];
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

下面是JS層的處理:

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);
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

不管OC中關于initialProperties的名字叫什么,在JS中都是this.props開頭,然后接下來才是key名字。

{"rootTag":1,"initialProps":{"images":["http://foo.com/bar1.png","http://foo.com/bar2.png"]}}. 
    
  • 1

使用appProperties進行參數傳遞

RCTRootView同樣提供了一個可讀寫的屬性appProperties。在appProperties設置之后,React Native應用將會根據新的屬性重新渲染。當然,只有在新屬性和舊的屬性有更改時更新才會被觸發。

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

可以隨時更新屬性,但是更新必須在主線程中進行,讀取則可以在任何線程中進行。

React Native執行原生方法及回調

React Native執行原生方法

.h的文件代碼:

#import <Foundation/Foundation.h> #import <RCTBridgeModule.h> @interface wjyTestManager : NSObject<RCTBridgeModule> @end
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

.m的文件代碼:

#import "wjyTestManager.h" @implementation wjyTestManager RCT_EXPORT_MODULE();

RCT_EXPORT_METHOD(doSomething:(NSString *)aString withA:(NSString *)a)
{ NSLog(@"%@,%@",aString,a);
} @end
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

為了實現RCTBridgeModule協議,你的類需要包含RCT_EXPORT_MODULE()宏。這個宏也可以添加一個參數用來指定在Javascript中訪問這個模塊的名字。如果你不指定,默認就會使用這個Objective-C類的名字。

并且必須明確的聲明要給Javascript導出的方法,否則React Native不會導出任何方法。OC中聲明要給Javascript導出的方法,通過RCT_EXPORT_METHOD()宏來實現。

import React, { Component } from 'react';
import {
  AppRegistry,
  StyleSheet,
  Text,
  View,
  Alert,
  TouchableHighlight,
} from 'react-native';

import {
  NativeModules,
  NativeAppEventEmitter
} from 'react-native'; var CalendarManager = NativeModules.wjyTestManager; class ReactNativeProject extends Component { render() { return (
          <TouchableHighlight onPress={()=>CalendarManager.doSomething('sdfsdf','sdfsdfs')}>
          <Text style={styles.text}
      >點擊 </Text>
          </TouchableHighlight>

        );
      }
} const styles = StyleSheet.create({
text: {
  flex: 1,
  marginTop: 55,
  fontWeight: 'bold' },
});

AppRegistry.registerComponent('ReactNativeProject', () => ReactNativeProject);
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

要用到NativeModules則要引入相應的命名空間import { NativeModules } from ‘react-native’;然后再進行調用CalendarManager.doSomething(‘sdfsdf’,’sdfsdfs’);橋接到Javascript的方法返回值類型必須是void。React Native的橋接操作是異步的,所以要返回結果給Javascript,你必須通過回調或者觸發事件來進行。

傳參并回調

RCT_EXPORT_METHOD(testCallbackEvent:(NSDictionary *)dictionary callback:(RCTResponseSenderBlock)callback)
{ NSLog(@"當前名字為:%@",dictionary); NSArray *events=@[@"callback ", @"test ", @" array"];
  callback(@[[NSNull null],events]);
}
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

說明:第一個參數代表從JavaScript傳過來的數據,第二個參數是回調方法; 
JS層代碼:

import {
  NativeModules,
  NativeAppEventEmitter
} from 'react-native'; var CalendarManager = NativeModules.wjyTestManager; class ReactNativeProject extends Component { render() { return (
          <TouchableHighlight onPress={()=>{CalendarManager.testCallbackEvent(
             {'name':'good','description':'http://www.lcode.org'},
             (error,events)=>{ if(error){
                   console.error(error);
                 }else{
                   this.setState({events:events});
                 }
           })}}
         >
          <Text style={styles.text}
      >點擊 </Text>
          </TouchableHighlight>

        );
      }
}
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

參數類型說明

RCT_EXPORT_METHOD 支持所有標準JSON類型,包括:

  • string (NSString)
  • number (NSInteger, float, double, CGFloat, NSNumber)
  • boolean (BOOL, NSNumber)
  • array (NSArray) 包含本列表中任意類型
  • object (NSDictionary) 包含string類型的鍵和本列表中任意類型的值
  • function (RCTResponseSenderBlock)

除此以外,任何RCTConvert類支持的的類型也都可以使用(參見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 *description=[RCTConvert NSString:dictionary[@"description"]]; NSString *info = [NSString stringWithFormat:@"Test: %@\nFor: %@\nTestTime: %@\nDescription: %@",name,location,time,description]; NSLog(@"%@", info);
}
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

iOS原生訪問React Native

如果需要從iOS原生方法發送數據到JavaScript中,那么使用eventDispatcher。例如:

#import "RCTBridge.h" #import "RCTEventDispatcher.h" @implementation CalendarManager @synthesize bridge = _bridge; //  進行設置發送事件通知給JavaScript端 - (void)calendarEventReminderReceived:(NSNotification *)notification
{ NSString *name = [notification userInfo][@"name"];
    [self.bridge.eventDispatcher sendAppEventWithName:@"EventReminder" body:@{@"name": name}];
} @end
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

在JavaScript中可以這樣訂閱事件,通常需要在componentWillUnmount函數中取消事件的訂閱。

import { NativeAppEventEmitter } from 'react-native';

var subscription = NativeAppEventEmitter.addListener( 'EventReminder',
  (reminder) => console.log(reminder.name)
); ... // 千萬不要忘記忘記取消訂閱, 通常在componentWillUnmount函數中實現。
subscription.remove();
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

用NativeAppEventEmitter.addListener中注冊一個通知,之后再OC中通過bridge.eventDispatcher sendAppEventWithName發送一個通知,這樣就形成了調用關系。

藍藍設計www.ocunn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 平面設計服務

日歷

鏈接

個人資料

藍藍設計的小編 http://www.ocunn.cn

存檔

免费黄色在线视频网站| 91福利精品第一导航| 国产超碰在线一区| 午夜一级久久| 综合久久一区| 精品视频日韩| 国产一区福利| 91麻豆精品| 国产精品粉嫩| 69xxx在线| 一区二区三区视频在线观看视频| 中文在线√天堂| 后入内射欧美99二区视频| 中文字幕69页| 日韩免费视频一区二区视频在线观看| 欧美大片xxxx| 日韩亚洲欧美中文字幕| 国产一区二区三区四区在线| 丰满岳乱妇一区二区| 国产又粗又猛大又黄又爽| 亚洲欧美自偷自拍另类| 黑人粗进入欧美aaaaa| 黄色片视频在线播放| 啊啊啊一区二区| 欧美精品一区二区三区三州| 日韩欧美视频免费在线观看| xxxxxx在线观看| 强伦女教师2:伦理在线观看| 中文字幕中文字幕99| 伊人狠狠色丁香综合尤物| 天天综合色天天综合色hd| 欧美韩国日本精品一区二区三区| 精品一区二区三区自拍图片区| 粉嫩av一区二区三区免费观看 | 久久国产黄色片| 国产精品1000| 欧美精品二区三区| 男人天堂视频网| 一级做a爱片性色毛片| 国产精品自拍电影| 丰满大乳国产精品| 人人超碰在线| 电影av一区| 麻豆网站在线观看| 男男gaygays亚洲| 国产伦理精品| 一区在线影院| 日韩精品久久久久久久软件91| 7777精品| 国产亚洲第一伦理第一区| 成人亚洲一区二区| 婷婷久久国产对白刺激五月99| 综合天堂av久久久久久久| 影音先锋亚洲精品| 美国十次了思思久久精品导航| 久久99精品国产.久久久久久| 国产福利一区在线观看| 久久久久久久久久久99999| 中文字幕二三区不卡| 亚洲一区二区3| 欧美在线不卡视频| 亚洲国产一区自拍| 久久伊人91精品综合网站| 久久久久成人精品| 国产日韩亚洲欧美| 久久综合一区| 男人添女荫道口图片| 国产日韩欧美久久| 国产精品无码在线| 久久久久久久久久综合| 一级全黄少妇性色生活片| 首播影院在线观看免费观看电视| 在线观看完整版免费| 中文字幕影音在线| 91免费精品国偷自产在线在线| 精品一区免费| 一区二区三区精品视频在线观看 | 国产精品黄视频| 国产一区二区在线观看免费播放| 国产对白在线播放| 污网站免费在线| 中文字幕第4页| 亚洲黄色一区二区| 97在线影院| av在线播放国产| 欧美成人黄色| 婷婷久久一区| 久久精品国产**网站演员| 久久亚区不卡日本| 日韩欧美aaa| 亚洲欧美国产日韩中文字幕| 91精品国产91久久| 九九九九九精品| 亚洲 自拍 另类小说综合图区| 国产精品久久久久久9999| 成年人二级毛片| 97人妻精品一区二区三区动漫| 天堂在线中文资源| 亚洲少妇视频| 欧美美女视频| 久久99精品久久久久婷婷| 亚洲视频一二三区| 亚洲缚视频在线观看| 国产91精品视频在线观看| 乱色588欧美| 我要看一级黄色大片| 亚洲天堂精品一区| www.色视频| 日本动漫同人动漫在线观看| 亚洲五码在线| 在线视频日韩| 国产精品高潮久久久久无| 欧美高清视频一二三区| 久久99亚洲热视| 精品国产一区二区三区麻豆免费观看完整版 | 成人精品在线观看视频| 中文字幕人妻精品一区| jizzjizz在线观看| 2020最新国产精品| 日本不卡高清视频| 亚洲综合色网站| 亚洲性夜色噜噜噜7777| 亚洲伊人久久综合| 日韩免费高清在线| 久久黄色小视频| 天堂在线一二区| 国产精品高清一区二区| 国产一级一区二区| 一区二区三区中文字幕| 国产一区二区三区在线看| 成人自拍网站| 国产精品自在自线| 天天干,天天干| 男人资源在线播放| 国产精品三级| 91丨九色丨国产丨porny| 8v天堂国产在线一区二区| 26uuu亚洲伊人春色| 超碰人人爱人人| 欧洲性xxxx| 中国动漫在线观看完整版免费| 欧美天堂一区二区| 日韩av中文字幕一区二区| 亚洲二区在线视频| 欧美激情亚洲精品| 黄色一级片黄色| 最新一区二区三区| 狠狠狠综合7777久夜色撩人| 欧美变态网站| 99久久免费视频.com| 精品国产一区久久| 51国偷自产一区二区三区| 国产无遮挡猛进猛出免费软件 | 日本男女交配视频| 无码黑人精品一区二区| 国产九九在线| 精品国产午夜| 中文字幕免费不卡| 播播国产欧美激情| av动漫免费观看| 黑鬼狂亚洲人videos| av在线播放免费| 日韩电影免费网址| 中文字幕成人网| www.日韩欧美| 中文字幕精品在线播放| 亚洲天堂黄色片| 免费网站看v片在线a| 亚洲国产精品成人| 亚洲第一激情av| 日本欧美精品在线| 亚洲色图偷拍视频| 丰满肉肉bbwwbbww| 国产精品久久久网站| 91小视频在线观看| 正在播放欧美视频| 男人的天堂视频在线| 免费观看一区二区三区毛片| 黄视频网站在线观看| 日本在线观看不卡视频| 欧美一区中文字幕| 激情视频一区二区| 国产黄色片在线| 99自拍视频在线观看| 国产欧美日韩综合一区在线播放| 欧美自拍偷拍一区| 国产精品美女久久久久av福利| 在线不卡av电影| 欧美jizzhd69巨大| 国产一区白浆| 91精品国产福利| 欧美不卡三区| 久久久久亚洲av片无码下载蜜桃 | 少妇视频一区| 国产在线观看一区二区| 日韩精品在线电影| www成人免费| 在线视频 91| 中文无码日韩欧| 国产精品免费久久| 国产91成人在在线播放| 波多野结衣电影免费观看| 中文在线√天堂| 欧美喷水视频| 欧美日韩精品一区二区三区蜜桃| 国产精选一区二区| 青娱乐免费在线视频| 日韩av影片| 粉嫩嫩av羞羞动漫久久久| 日韩中文字幕不卡视频| 男人的天堂99| 天堂网在线中文| 我不卡手机影院| 欧美日韩一区精品| 四虎永久在线精品免费一区二区| 精品欧美一区二区三区免费观看| 亚洲美女色播| ...xxx性欧美| 成人在线中文字幕| 麻豆视频在线免费看| 主播大秀视频在线观看一区二区| 久久综合中文字幕| 日本免费一区二区三区视频观看| 国产a级黄色片| 成人在线app| 国产很黄免费观看久久| 欧美寡妇偷汉性猛交| 99riav国产精品视频| 麻豆视频在线观看免费| 精品一区二区国语对白| www.久久撸.com| 91亚洲一区二区| 老司机在线视频二区| 久久精品国产99国产| 精品国模在线视频| 欧美日韩一区二区区别是什么| 日本在线播放| 国产成人亚洲综合a∨婷婷图片| 欧美日韩成人在线播放| 亚洲观看黄色网| 男人av在线播放| 国产精品麻豆网站| 91精品国产91久久久久青草| 国产精品成人av久久| 老牛影视av一区二区在线观看| 欧美日韩中文在线观看| 一区二区欧美日韩| 天堂网av在线播放| 久久久久久久波多野高潮日日| 一区二区成人av| 老熟女高潮一区二区三区| 国产丝袜在线观看视频| 久久久久国产精品麻豆ai换脸| 国产精品午夜视频| 伊人久久综合视频| 狠狠操综合网| 精品av久久707| 在线观看av网页| 青青草原av在线| 亚洲国产电影在线观看| 国产精品一区而去| 国产精品久久久久久无人区| 好看的亚洲午夜视频在线| 夜夜嗨av色一区二区不卡| 久久久久久久久久久久国产精品| 理论不卡电影大全神| 亚洲人午夜精品天堂一二香蕉| 免费国产一区| 成人毛片在线免费观看| 日韩和欧美的一区| 国产91成人在在线播放| 国产亚洲第一页| 精品免费在线| 日韩国产欧美区| 亚洲少妇一区二区| 成人精品一区二区三区电影| 欧美日韩国产精品一区| www.xxx麻豆| 视频免费一区| 日本一二三不卡| 欧美性色黄大片人与善| 人成网站在线观看| 国产一区二区免费在线| 国产日韩av在线播放| 中文字幕欧美人妻精品一区蜜臀| 中文亚洲欧美| 78色国产精品| 国产精品第5页| 在线精品在线| 97色在线视频观看| 久久99精品波多结衣一区| 中文精品久久| 欧美成人激情视频| 中文字幕影音先锋| 五月激情久久久| 久久国内精品一国内精品| 亚洲人与黑人屁股眼交| 成人毛片在线| 精品国内亚洲在观看18黄| www欧美com| 中文字幕亚洲精品乱码| 欧美精品九九久久| 东京热一区二区三区四区| 亚洲高清成人| 热久久这里只有| 国产精品成人久久久| 石原莉奈一区二区三区在线观看| 国产精品久久久av久久久| 国产精品久久久久久久久久久久久久久久 | 亚洲成人动漫一区| av视屏在线播放| 亚洲国产尤物| 欧美一区日韩一区| 国产一级二级视频| 伊甸园亚洲一区| 久久久精品999| 日韩高清精品免费观看| 性伦欧美刺激片在线观看| 国产精品一区久久| 丰满少妇高潮在线观看| www.色精品| 一区二区三区四区视频在线观看| 日本综合在线| 天天影视涩香欲综合网 | 久久黄色一级视频| 国产精品色在线网站| 中文字幕欧美日韩va免费视频| 青娱乐免费在线视频| 免费视频一区| 91精品在线观| 亚洲精品一区视频| 亚洲综合久久久久| 日本中文字幕精品—区二区| 国模大尺度视频一区二区| 亚洲欧美视频在线| 国产无遮无挡120秒| 日韩成人精品在线| 精品视频在线观看| 黄色网页在线看| 精品1区2区3区| 中文字幕第4页| 国产一在线精品一区在线观看| 国产欧美日韩免费| 污黄色在线观看| 亚洲成a天堂v人片| 日本中文字幕精品| 日韩欧美视频| 国产精品99导航| 粉嫩tv在线播放| 亚洲一区中文日韩| 精品人妻一区二区三区免费| 精品中文一区| 日本免费一区二区三区视频观看| 天天干天天爱天天操| 一区二区视频在线| 人妻精油按摩bd高清中文字幕| 成人精品天堂一区二区三区| 国产精品国语对白| 欧美91精品久久久久国产性生爱| 欧美日韩性视频在线| 欧美色图亚洲激情| 一区二区动漫| 日本一区二区三区四区在线观看| h片在线观看| 精品亚洲一区二区三区四区五区| 国产污污视频在线观看| 成人国产电影网| 国内自拍在线观看| 日韩aaa久久蜜桃av| 青青在线视频一区二区三区| 夜鲁很鲁在线视频| 在线中文字幕一区二区| 日韩欧美在线视频播放| 久久99精品久久久久久久久久久久| 中文字幕一区综合| 欧美a在线观看| 欧美亚洲国产精品| 毛片免费在线| 91精品免费观看| 国产精品999在线观看| av亚洲精华国产精华精华| 久草综合在线观看| 久久精品播放| 国产精品免费看一区二区三区| av福利导福航大全在线| 国产一区二区三区中文| 性生交生活影碟片| 亚洲电影在线免费观看| 色欲狠狠躁天天躁无码中文字幕 | 亚洲第一av在线| 日本中文字幕在线| 中文无字幕一区二区三区| 国产精品熟妇一区二区三区四区 | 日韩高清在线不卡| 免费的一级黄色片| 同性恋视频一区| 91超碰在线电影| www.综合| 色综合色综合久久综合频道88| 成人动漫av|