React Native使用指南-植入原生应用

由于React并没有假设你其余部分的技术栈——它通常只作为MVC模型中的V存在——它也很容易嵌入到一个并非由React Native开发的应用当中。实际上,它可以和常见的许多工具结合,譬如CocoaPods。

需求

  • CocoaPods – gem install cocoapods
  • Node.js
    • 安装 nvm(安装向导在这里)。然后运行nvm install node && nvm alias default node,这将会默认安装最新版本的Node.js并且设置好命令行的环境变量,这样你可以输入node命令来启动Node.js环境。nvm使你可以可以同时安装多个版本的Node.js,并且在这些版本之间轻松切换。
  • 在你JS代码文件所在目录下,安装React Native依赖:npm install react-native --save

通过CocoaPods安装React Native

CocoaPods是iOS/Mac开发最常用的包管理工具。我们需要用它来引入React Native。如果你还没安装过CocoaPods,参考这篇文章。

当你准备好开始使用CocoaPods之后,往Podfile中增加以下的内容。如果你还没有这个文件,在你工程的根目录下创建一个。

# 取决于你的工程如何组织,你的node_modules文件夹可能会在别的地方。
# 请将:path后面的内容修改为正确的路径。
pod 'React', :path => './node_modules/react-native', :subspecs => ['Core','RCTImage','RCTNetwork','RCTText','RCTWebSocket',# 添加其他你想在工程中使用的依赖。
]

记得要添加所有你需要的依赖。举例来说,<Text>元素如果不添加RCTText依赖就不能运行。

接着安装你的pods:

$ pod install

创建你的React Native应用

有两个地方需要准备:

  1. 入口JavaScript文件必须要包含你实际的React Native应用和其他的组件。
  2. 封装Objective-C代码,加载你的脚本并创建一个RCTRootView来显示和管理你的React Native组件。

首先,创建一个文件夹来保存你的React代码,然后创建一个index.ios.js文件。

$ mkdir ReactComponent
$ touch ReactComponent/index.ios.js

然后复制并粘贴一个index.ios.js的初始代码——这是一个简单的React Native应用:

'use strict';var React = require('react-native');
var {Text,View
} = React;var styles = React.StyleSheet.create({container: {flex: 1,backgroundColor: 'red'}
});class SimpleApp extends React.Component {render() {return (<View style={styles.container}><Text>This is a simple application.</Text></View>)}
}React.AppRegistry.registerComponent('SimpleApp', () => SimpleApp);

SimpleApp就是你的模块名,这个在后面会要用到。

往应用里添加容器视图

你需要添加一个容器视图来容纳React Native组件。它可以是你应用里任何的UIView

Container view example

不过,为了让代码更整洁,我们可以派生一个UIView,取名ReactView。打开你的Yourproject.xcworkspace来创建一个新的ReactView类(你也可以取任何你想要的名字!)

// ReactView.h#import <UIKit/UIKit.h>
@interface ReactView : UIView
@end

在想要管理这个视图的视图管理器中,添加一个outlet然后连接它:

// ViewController.m@interface ViewController ()
@property (weak, nonatomic) IBOutlet ReactView *reactView;
@end

这里我出于简化目的禁用了AutoLayout。在实际生产环境中,通常你都应该打开AutoLayout并且设置相应的约束。

往容器视图里添加RCTRootView

准备好开始最有意思的部分了吗?现在我们要创建RCTRootView来包含你的React Native应用。

ReactView.m中,我们需要先使用你的index.ios.bundle的URI来初始化RCTRootViewindex.ios.bundle会由packager服务创建,可以通过React Native服务器访问到。我们会在后面讨论这个问题。

NSURL *jsCodeLocation = [NSURL URLWithString:@"http://localhost:8081/index.ios.bundle?platform=ios"];
// For production use, this `NSURL` could instead point to a pre-bundled file on disk:
//
//   NSURL *jsCodeLocation = [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
//
// generated by "Bundle React Native code and images" build step.
//
//   curl http://localhost:8081/index.ios.bundle -o main.jsbundle
RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocationmoduleName: @"SimpleApp"launchOptions:nil];

然后把它添加为ReactView的子视图。

[self addSubview:rootView];
rootView.frame = self.bounds;

启动开发服务器。

译注:这一部分的官方文档都有一些过时。翻译组在翻译&审校完其它部分的文档后,如果官方文档还没有更新,会帮助校正官方文档的同时翻译中文文档。

在工程的根目录下,我们可以开启React Native开发服务器:

(JS_DIR=`pwd`/ReactComponent; cd node_modules/react-native; npm run start -- --root $JS_DIR)

这条命令会启动一个React Native开发服务器,用于构建我们的bundle文件。--root选项用来标明你的React Native应用所在的根目录。在我们这里是ReactComponents目录,里面有一个index.ios.js文件。开发服务器启动后会打包出index.ios.bundle文件来,并可以通过http://localhost:8081/index.ios.bundle来访问。

编译和运行

现在编译和运行你的应用。你应该可以看到你的React Native应用在ReactView内运行。

Example

在模拟器下也可以实现热加载(需要在Build Settings -> Preprocessor Macros中设置DEBUG=1)。现在你已经拥有了一个React组件,它在Objective-C中完全表现为一个UIView的子类。

总结

在底层,当RCTRootView初始化完成以后,它会尝试从开发服务器下载、解析并运行打包后的脚本文件。所以你所要做的就是实现你自己的容器视图或者视图控制器,然后把RCTRootView作为子视图加入——接下来RCTRootView会搞定你的脚本文件然后渲染你的React组件。太棒了!

你可以在这里获得一个样例应用的完整源代码。


本文转自React Native中文网:http://reactnative.cn/docs/0.20/embedded-app-ios.html#content

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/500019.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[数据库]---nosql,非关系型数据库整理

1.关系型数据库与非关系型数据库的区别 Tables关系型数据库非关系型数据库成本好的收费开源的,都免费的存储与查询硬盘存储,相对查的慢内存存储,查的快存储格式只能是基本格式多种多样年龄出现时间较长,较成熟后起之秀,不可小觑扩展性join等不好扩展方便集群事务强事务弱事务查…

React Native开发指南-在原生和React Native间通信

通过植入原生应用和原生UI组件两篇文档&#xff0c;我们学习了React Native和原生组件的互相整合。在整合的过程中&#xff0c;我们会需要在两个世界间互相通信。有些方法已经在其他的指南中提到了&#xff0c;这篇文章总结了所有可行的技术。 简介 React Native是从React中得到…

数据迁移记录

做数据迁移,数据库是分两片,每片一主两从,没有读写分离 前提: 使用服务器1:2核4G内存40G硬盘 线程池:5个 每个线程分页查询,每页1000条 平均数据是一天一个线程,一天3万数据,所以大概就是30页的分页深度 服务器1的数据: cpu使用率在74%上下(有点高,2核的毕竟比不过4核的…

RPC协议简介

一、概述 1.英文原义&#xff1a;Remote Procedure Call Protocol 2.中文释义&#xff1a;&#xff08;RFC-1831&#xff09;远程调用协议 。 3.注解&#xff1a;一种通过网络从远程计算机程序上请求服务&#xff0c;而不需要了解底层网络技术的协议。 4.说明&#xff1a;RPC…

mysql分页查询报错,及解决

mysql分页查询报错: 前提: 1.每页1000条数据 2.查到57页的时候,就报错了 以下是错误信息: org.springframework.jdbc.UncategorizedSQLException: ### Error querying database. Cause: java.sql.SQLException: ...省略中间... received message larger than max (1844105…

RPC协议与Web Service

一、引入 我们每天都在使用浏览器来上网冲浪, 在查找自己需要的资源, HTTP协议自然是我们使用的最多的 一种, 我们尽情地享受着这种信息高速路的快感,却没有试图去了解我们是如何获得这些资源的? 它是一种什么样的设计理念? 我们也偶尔会使用 Gtalk来和自己的同事或者朋友来聊…

如何设置电脑开机自动提示(防止忘打卡等)

如何设置电脑开机自动提示: 第一种方法: 第一步:CtrlR 输入mmc命令打开 文件-添加/删除管理单元-组策略对象编辑器-添加-确定-确定(都是默认的)。 第二步:退出小框,会看见有个”本地计算机 策略”,打开-计算机配置-windows设置-安全设置-本地策略-安全选项 双击”交互式登…

RestFull架构

1 什么是REST REST全称是Representational State Transfer&#xff0c;中文意思是表述性状态转移。 它首次出现在2000年Roy Fielding的博士论文中&#xff0c;Roy Fielding是 HTTP 规范的主要编写者之一。 他在论文中提到:“我这篇文章的写作目的&#xff0c;就是想在符合架构原…

SpringMVC默认访问路径配置

SpringMVC默认访问路径配置 需求:只访问域名,不加任何action路径,想访问默认的一个action. 比如www.jd.com,就跳到京东首页,会加载出辣么多东西来 关于这个的方法,网上有千千万种,在这里只是记录一种常用的, 亲测这个可以用,而且我们的项目一直都是这个套路. 第一步,web.x…

controller中执行main方法报错NoClassDefFoundError: javax/servlet/http/HttpServletResponse

controller中执行main方法报了这个错:NoClassDefFoundError: javax/servlet/http/HttpServletResponse,如下图: NoClassDefFoundError: javax/servlet/http/HttpServletResponse NoClassDefFoundError: javax/servlet/http/HttpServletRequest同理 原因是本地没有引入servlet…

初探Backbone

Backbone简介 中文API&#xff1a;http://www.css88.com/doc/backbone/ 英文API&#xff1a;http://backbonejs.org/ Backbone是构建javascript应用程序的一个优秀的类库。他简洁、轻量级、功能实在。 backbone采用MVC模式&#xff0c;本身提供了模型、控制器和视图从而我们应用…

订单量的监控

要解决的问题 : 1.在电商项目中,如何准确的知道当前订单量是正常的 2.如何在订单量突变后快速感知 解决思路 : 实现一个关于订单量的监控系统,将历史数据与实时数据做对比,因为每天的订单量,基本都是一个相似的变化范围,比如凌晨4点的单量是一天中最少的,节假日的单量要小于工…

JQuery初探

一、JQuery是什么&#xff1f; JQuery 是一套JavaScript库&#xff0c; 使用它&#xff0c;可以很方便的进行 JavaScript的编程。比如&#xff1a; 获取页面元素&#xff0c; 修改页面元素的CSS样式等等都可以以很简单的语法完成。节省代码行数和减少开发的时间。 物理上来看就…

BigDecimal的异常记录:java.lang.ArithmeticException: Rounding necessary

记一次报错,代码样例: public static void main(String[] args) {BigDecimal bigDecimal new BigDecimal(1234.5);int res bigDecimal.intValueExact();} 报错信息: Exception in thread "main" java.lang.ArithmeticException: Rounding necessaryat java.math.…

JavaScript历史与ECMAScript

一、前言为了发挥 JavaScript 的全部潜力&#xff0c;了解它的本质、历史及局限性是十分重要的。本节为您讲解 JavaScript 和客户端脚本的起源。二、Nombas 和 ScriptEase大概在 1992 年&#xff0c;一家称作 Nombas 的公司开发了一种叫做 C 减减&#xff08;C-minus-minus&…

基于abtest思想的流量切换(nginx lua redis)

使用前提: 项目重构了,旧项目还在线上运行,新项目准备替换线上的旧项目 最终目标: 要实现实时切换新旧项目,保证如果新项目上线后有问题,可以立刻快速的将流量切回旧项目 方案: 关于abtest的基本原理本文不再多说,本文重点是实践&#xff0c;先看图 如上图所示,用户访问的…

JavaScript内部实现

前言 JavaScript 的核心 ECMAScript 描述了该语言的语法和基本对象&#xff1b; DOM 描述了处理网页内容的方法和接口&#xff1b; BOM 描述了与浏览器进行交互的方法和接口。 ECMAScript、DOM 和 BOM 尽管 ECMAScript 是一个重要的标准&#xff0c;但它并不是 JavaScript 唯一…

jsonp跨域原理,使用以及同源策略

什么是跨域请求,为什么用跨域 浏览器从一个域名的网页去请求另一个域名的资源时&#xff0c;域名,端口,协议任何一个不同&#xff0c;都算是跨域请求 域名是一个网站的唯一标识,一个域名代表着一个网站以及其对应的服务 服务间调用可以使用基于soa思想的rpc调用,也可以是webs…

LESS语言简介

一、概述 LESS是一种 动态 样式 语言. LESS 将 CSS 赋予了动态语言的特性&#xff0c;如 变量&#xff0c; 继承&#xff0c; 运算&#xff0c; 函数. LESS 既可以在 客户端 上运行 (支持IE 6, Webkit, Firefox)&#xff0c;也可以借助Node.js或者Rhino在服务端运行。 LE…

非对称加密算法之RSA算法实现

对称加密&#xff0c;非对称加密&#xff0c;公钥&#xff0c;私钥&#xff0c;RSA这些常常听到的&#xff0c;到底是怎么回事 有个同事问我公钥私钥到底为什么能互相解开&#xff0c;一时语塞&#xff0c;平时都只是知道怎么用&#xff0c;但很少去了解的更细&#xff0c;现在…