每种语言都有自己的设计理念、语法、运行环境,这也导致了不同语言间相互交流通信时必须要有中介来翻译,如JAVA与C/C++通过JNI来交流、OC与C/C++需要在.mm文件混编、而JAVA/OC与Lua通信时需要通过C/C++语言来做中介。那么在React-Native中JSX是如何与底层模块进行通信的呢?这里主要以iOS系统来做说明。

原理
通信本质上是信息的交流,具体到计算机语言则是数据的流动。应用中数据在React-Native与原生模块间的流动与共享,完成了与用户的交互,达成了应用的目标。React-Native与OC间通信的数据只能是下面的几种类型(前为JS类型,后为OC类型):
其它类型的数据需要通过一定的规则转换成这几种类型后(一般都会转换成JSON串)再通信.
React-Native本质是通过JavaScriptCore.framework实现JS代码与OC代码间的互动。因此下面说的几种方式在本质原理上都是相同的,不同的地方只是在于实现形式与方法的差别。
函数调用
在将原生模块封装并提供给React-Native使用时,可以通过RCT_EXPORT_METHOD()宏向React-Native侧定义其可以调用的接口函数,完成两模块间的通信。
//定义了startVPN接口,React-Native将VPN的具体参数通过该接口传入到原生模块,开启指定的VPN
RCT_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之通信机制
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# React
# Native与JS模块通信
# Native
# JS模块通信
# React Native:react-native-code-push报错的解决
# 浅谈react-native热更新react-native-pushy集成遇到的问题
# react-native消息推送实现方式
# 的是
# 返回值
# 感兴趣
# 可以通过
# 几种
# 来做
# 转换成
# 自己的
# 都是
# 完成了
# 几种类型
# 都有
# 运行环境
# 则是
# 要有
# 两种
# 互动
# 这也
# 达到了
# 第二个
相关文章:
建站主机类型有哪些?如何正确选型
潮流网站制作头像软件下载,适合母子的网名有哪些?
深圳防火门网站制作公司,深圳中天明防火门怎么编码?
如何快速重置建站主机并恢复默认配置?
油猴 教程,油猴搜脚本为什么会网页无法显示?
如何选择高效稳定的ISP建站解决方案?
招商网站制作流程,网站招商广告语?
如何快速使用云服务器搭建个人网站?
网站制作公司,橙子建站是合法的吗?
官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站
浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?
清除minerd进程的简单方法
如何用VPS主机快速搭建个人网站?
想学网站制作怎么学,建立一个网站要花费多少?
如何在Windows服务器上快速搭建网站?
,网页ppt怎么弄成自己的ppt?
临沂网站制作企业,临沂第三中学官方网站?
头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?
,sp开头的版面叫什么?
陕西网站制作公司有哪些,陕西凌云电器有限公司官网?
在线制作视频网站免费,都有哪些好的动漫网站?
如何高效配置香港服务器实现快速建站?
如何在新浪SAE免费搭建个人博客?
如何在云主机上快速搭建网站?
零基础网站服务器架设实战:轻量应用与域名解析配置指南
建站之星客服服务时间及联系方式如何?
极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?
建站之星如何修改网站生成路径?
如何在建站宝盒中设置产品搜索功能?
建站之星导航如何优化提升用户体验?
中山网站推广排名,中山信息港登录入口?
如何快速搭建自助建站会员专属系统?
广州营销型建站服务商推荐:技术优势与SEO优化解析
沈阳制作网站公司排名,沈阳装饰协会官方网站?
番禺网站制作公司哪家值得合作,番禺图书馆新馆开放了吗?
建站之星如何助力企业快速打造五合一网站?
网站图片在线制作软件,怎么在图片上做链接?
如何用西部建站助手快速创建专业网站?
建站之星代理商如何保障技术支持与售后服务?
C++如何将C风格字符串(char*)转换为std::string?(代码示例)
MySQL查询结果复制到新表的方法(更新、插入)
建站之星CMS五站合一模板配置与SEO优化指南
北京企业网站设计制作公司,北京铁路集团官方网站?
义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?
Android自定义控件实现温度旋转按钮效果
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
建站主机如何安装配置?新手必看操作指南
个人摄影网站制作流程,摄影爱好者都去什么网站?
c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】
如何配置支付宝与微信支付功能?
*请认真填写需求信息,我们会在24小时内与您取得联系。