嫩草影院久久99_老司机午夜网站国内精品久久久久久久久_久久夜色精品国产_国产一级做a爰片久久毛片

React Native原生與JS層交互

2018-7-2    seo達(dá)人

如果您想訂閱本博客內(nèi)容,每天自動(dòng)發(fā)到您的郵箱中, 請(qǐng)點(diǎn)這里

最近在對(duì)《React Native移動(dòng)開發(fā)實(shí)戰(zhàn)》一書進(jìn)行部分修訂和升級(jí)。在React Native開發(fā)中,免不了會(huì)涉及到原生代碼與JS層的消息傳遞等問題,那么React Native究竟是如何實(shí)現(xiàn)與原生的互相操作的呢?

原生給React Native傳參

原生給React Native傳值

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

使用RCTRootView將React Natvie視圖封裝到原生組件中。RCTRootView是一個(gè)UIView容器,承載著React Native應(yīng)用。同時(shí)它也提供了一個(gè)聯(lián)通原生端和被托管端的接口。

例如有下面一段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中關(guān)于initialProperties的名字叫什么,在JS中都是this.props開頭,然后接下來才是key名字。

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

使用appProperties進(jìn)行參數(shù)傳遞

RCTRootView同樣提供了一個(gè)可讀寫的屬性appProperties。在appProperties設(shè)置之后,React Native應(yīng)用將會(huì)根據(jù)新的屬性重新渲染。當(dāng)然,只有在新屬性和舊的屬性有更改時(shí)更新才會(huì)被觸發(fā)。

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

可以隨時(shí)更新屬性,但是更新必須在主線程中進(jìn)行,讀取則可以在任何線程中進(jìn)行。

React Native執(zhí)行原生方法及回調(diào)

React Native執(zhí)行原生方法

.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

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

并且必須明確的聲明要給Javascript導(dǎo)出的方法,否則React Native不會(huì)導(dǎo)出任何方法。OC中聲明要給Javascript導(dǎo)出的方法,通過RCT_EXPORT_METHOD()宏來實(shí)現(xiàn)。

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}
      >點(diǎn)擊 </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則要引入相應(yīng)的命名空間import { NativeModules } from ‘react-native’;然后再進(jìn)行調(diào)用CalendarManager.doSomething(‘sdfsdf’,’sdfsdfs’);橋接到Javascript的方法返回值類型必須是void。React Native的橋接操作是異步的,所以要返回結(jié)果給Javascript,你必須通過回調(diào)或者觸發(fā)事件來進(jìn)行。

傳參并回調(diào)

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

說明:第一個(gè)參數(shù)代表從JavaScript傳過來的數(shù)據(jù),第二個(gè)參數(shù)是回調(diào)方法; 
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}
      >點(diǎn)擊 </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

參數(shù)類型說明

RCT_EXPORT_METHOD 支持所有標(biāo)準(zhǔn)JSON類型,包括:

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

除此以外,任何RCTConvert類支持的的類型也都可以使用(參見RCTConvert了解更多信息)。RCTConvert還提供了一系列輔助函數(shù),用來接收一個(gè)JSON值并轉(zhuǎn)換到原生Objective-C類型或類。例如:

#import "RCTConvert.h" #import "RCTBridge.h" #import "RCTEventDispatcher.h" //  對(duì)外提供調(diào)用方法,為了演示事件傳入屬性字段 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原生方法發(fā)送數(shù)據(jù)到JavaScript中,那么使用eventDispatcher。例如:

#import "RCTBridge.h" #import "RCTEventDispatcher.h" @implementation CalendarManager @synthesize bridge = _bridge; //  進(jìn)行設(shè)置發(fā)送事件通知給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函數(shù)中取消事件的訂閱。

import { NativeAppEventEmitter } from 'react-native';

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

用NativeAppEventEmitter.addListener中注冊(cè)一個(gè)通知,之后再OC中通過bridge.eventDispatcher sendAppEventWithName發(fā)送一個(gè)通知,這樣就形成了調(diào)用關(guān)系。

藍(lán)藍(lán)設(shè)計(jì)m.sdgs6788.com )是一家專注而深入的界面設(shè)計(jì)公司,為期望卓越的國(guó)內(nèi)外企業(yè)提供卓越的UI界面設(shè)計(jì)、BS界面設(shè)計(jì) 、 cs界面設(shè)計(jì) 、 ipad界面設(shè)計(jì) 、 包裝設(shè)計(jì) 、 圖標(biāo)定制 、 用戶體驗(yàn) 、交互設(shè)計(jì)、 網(wǎng)站建設(shè) 平面設(shè)計(jì)服務(wù)

日歷

鏈接

個(gè)人資料

存檔

嫩草影院久久99_老司机午夜网站国内精品久久久久久久久_久久夜色精品国产_国产一级做a爰片久久毛片
<em id="09ttv"></em>
    <sup id="09ttv"><pre id="09ttv"></pre></sup>
    <dd id="09ttv"></dd>

        • 亚洲精品视频一区| 亚洲高清视频在线观看| 亚洲黑丝一区二区| 亚洲国产精品久久久久秋霞影院| 免费永久网站黄欧美| 亚洲国产三级| 欧美一区二区免费观在线| 韩国成人精品a∨在线观看| 欧美承认网站| 亚洲欧美视频在线| 欧美成人一区二区三区| 亚洲手机视频| 激情久久久久久久| 欧美日韩免费看| 欧美自拍偷拍午夜视频| 91久久线看在观草草青青| 亚洲综合色网站| 亚洲福利一区| 国产精品青草久久久久福利99| 久久人人97超碰国产公开结果 | 久久国产精品一区二区三区| 很黄很黄激情成人| 欧美日韩亚洲一区二区三区在线观看 | 亚洲天堂久久| 激情久久婷婷| 久久本道综合色狠狠五月| 亚洲日本成人| 久久这里只有| 亚洲自拍偷拍麻豆| 亚洲黄色在线看| 国产婷婷色一区二区三区四区| 欧美精品国产一区| 久久精品国产v日韩v亚洲 | 欧美三级小说| 免费成人毛片| 欧美一区二区日韩| 一区二区不卡在线视频 午夜欧美不卡'| 久久精品国产亚洲一区二区三区| 一区二区高清在线| 91久久国产自产拍夜夜嗨| 国产欧美视频一区二区三区| 欧美日韩国产不卡| 欧美成人午夜剧场免费观看| 久久久久国色av免费观看性色| 亚洲影视九九影院在线观看| 日韩视频一区二区在线观看 | 欧美肥婆在线| 久久亚洲高清| 久久国内精品视频| 亚洲一区区二区| 日韩一级精品视频在线观看| 欧美二区不卡| 欧美本精品男人aⅴ天堂| 国内揄拍国内精品久久| 国产精品高潮呻吟久久| 欧美日韩国语| 欧美精品一区二区在线播放| 美女脱光内衣内裤视频久久影院| 久久久久9999亚洲精品| 欧美一区二区三区免费视| 亚洲一区二区四区| 亚洲影院色无极综合| 亚洲深夜激情| 亚洲一区成人| 亚洲欧美国产高清| 亚洲欧美日韩精品在线| 亚洲性线免费观看视频成熟| 亚洲一区二区三区精品在线| 亚洲一区二区不卡免费| 亚洲香蕉在线观看| 亚洲在线成人精品| 午夜精品一区二区在线观看| 西西裸体人体做爰大胆久久久 | 日韩视频在线观看国产| 亚洲美女在线看| 一区二区三区回区在观看免费视频| 亚洲精品欧美| 亚洲午夜精品久久| 性欧美xxxx大乳国产app| 欧美伊人精品成人久久综合97 | 在线综合亚洲| 亚洲欧美日韩精品久久亚洲区 | 国产一区二区三区在线播放免费观看| 国产精品亚洲一区二区三区在线| 国产精品夜夜嗨| 国内精品模特av私拍在线观看| 国内精品视频666| 亚洲国产精品日韩| 一区二区三区国产盗摄| 香蕉乱码成人久久天堂爱免费| 欧美一区深夜视频| 久久频这里精品99香蕉| 亚洲第一级黄色片| 艳女tv在线观看国产一区| 亚洲永久视频| 久久久水蜜桃av免费网站| 女生裸体视频一区二区三区| 欧美日韩一区在线| 国产私拍一区| 亚洲精品乱码久久久久| 亚洲综合不卡| 久久在线观看视频| 亚洲精品中文字| 欧美一二三视频| 欧美寡妇偷汉性猛交| 亚洲午夜免费福利视频| 久久精品视频在线观看| 欧美区视频在线观看| 国产视频在线一区二区 | 亚洲天堂免费观看| 久久久久www| 亚洲精选成人| 午夜亚洲福利在线老司机| 嫩草影视亚洲| 国产区在线观看成人精品| 亚洲国产高清aⅴ视频| 亚洲女ⅴideoshd黑人| 女人色偷偷aa久久天堂| 亚洲视频一区在线| 美女在线一区二区| 国产精品久久福利| 亚洲国产高清高潮精品美女| 午夜激情一区| 亚洲日本理论电影| 久久久久久一区| 国产精品日韩一区| 日韩图片一区| 欧美1区视频| 亚洲中字黄色| 欧美日韩免费区域视频在线观看| 激情久久影院| 午夜精品久久久久久久久久久久久 | 欧美激情91| 国产综合视频在线观看| 亚洲天堂黄色| 最新日韩精品| 久久综合伊人77777尤物| 国产免费成人在线视频| 日韩视频中午一区| 欧美电影免费| 久久九九精品| 国产亚洲精品一区二555| 亚洲中字在线| 亚洲美女尤物影院| 欧美激情导航| 亚洲黄色小视频| 理论片一区二区在线| 亚洲欧美另类中文字幕| 国产精品多人| 亚洲一级二级在线| 亚洲毛片在线观看| 欧美激情一区在线观看| 亚洲激情婷婷| 欧美freesex交免费视频| 欧美在线精品免播放器视频| 国产精品综合不卡av| 亚洲在线免费观看| 99国产精品视频免费观看一公开| 欧美精品1区| 日韩一级成人av| 亚洲精华国产欧美| 欧美国产欧美综合 | 欧美国产日韩精品免费观看| 久久九九精品99国产精品| 国产亚洲激情视频在线| 久久国产夜色精品鲁鲁99| 午夜精品成人在线| 国产精品网站在线播放| 欧美一级视频一区二区| 亚洲欧美另类综合偷拍| 国产视频欧美视频| 久久米奇亚洲| 久久网站免费| 最新日韩精品| 亚洲精品三级| 国产精品大片免费观看| 午夜欧美精品| 欧美一区二区三区四区夜夜大片| 国产综合欧美| 欧美激情第10页| 欧美精品大片| 亚洲男同1069视频| 性视频1819p久久| 在线日韩精品视频| 亚洲激情中文1区| 国产精品国产馆在线真实露脸| 欧美夜福利tv在线| 久久精品免费看| 亚洲理伦电影| 一区二区三区高清| 国产一区二区三区高清播放| 免费91麻豆精品国产自产在线观看| 美女黄毛**国产精品啪啪| 日韩一级黄色大片| 亚洲一区尤物| 玉米视频成人免费看| 最新成人av网站| 国产精品久久久久久久7电影| 久久精品一区| 欧美高清在线一区|