在现有的原生应用中嵌入React Native页面(ios版)

通常情况下我们有两种方式来构建一个使用RN技术的应用:

  1. RN包原生。应用入口由RN控制,页面跳转逻辑也由RN主导,当涉及做原生增强时使用RN的API构建一些原生的模块并暴露出来给RN调用。
  2. 原生包RN。应用入口由原生代码控制,页面跳转逻辑由原生主导。某些跨平台业务逻辑页面由RN开发。充分利用RN的跨平台特性,较少原生开发的巨大成本。

当采用第二种方式时就需要在原生应用中嵌入RN页面。现在就手把手的教大家如何操作。为方便大家理解,我们从一个全新创建的Objective C项目出发。

第一步,创建一个OC原生项目。

在XCode中快速地创建一个OC single view 项目。

第二步,添加RN需要的npm依赖项目。

和其他js项目一样,添加RN的npm 依赖首先需要在项目的根目录下创建一个package.json文件。二话不说,直接在项目根目录下新建package.json,然后拷入以下代码:

{
    "name": "EmbedRN","version": "0.0.1","private": true,"scripts": {
      "start": "node node_modules/react-native/local-cli/cli.js start","test": "jest"
    },"dependencies": {
      "react": "~15.4.0-rc.4","react-native": "0.38.0"
    },"devDependencies": {
      "babel-jest": "21.0.0","babel-preset-react-native": "3.0.2","jest": "21.0.1","jest-react-native": "18.0.0","prop-types": "^15.5.10","react-test-renderer": "~15.4.0-rc.4"
    },"jest": {
      "preset": "react-native"
    }
  }

React和RN的版本根据自己的需要进行设定,但要注意二者版本匹配。如果不确定可以自己先react-native init一个项目看一下版本号。

接下来,熟悉得不能再熟悉的动作了: npm install。

安装完成后我们在项目的根目录下就多了一个子目录node_modules/。亲切吧。

第三步,安装cocopod依赖项。

使用cocodpod可以快速帮助我们添加React Native依赖项到原生项目里去。首先在项目根目录下新建Podfile(通过执行pod init),这是cocopod的依赖项目录。
拷入以下内容:

target 'EmbedRN' do
  # 'node_modules'目录一般位于根目录中
  # 但是如果你的结构不同,那你就要根据实际路径修改下面的`:path`
  pod 'React',:path => './node_modules/react-native',:subspecs => [
    'Core','RCTText','RCTNetwork','RCTWebSocket',# 这个模块是用于调试功能的
    # 在这里继续添加你所需要的模块
  ]
end

依赖的库名是React,根据项目的需要添加不同的subspecs进来。如要使用Text那么加进来RCTText,Image就加RCTImage等等。可用的subspecs列表可以查阅node_modules/react-native/React.podspec文件。

好了,有了node_modules和Podfile,接下来运行命令:

pod install

Pod项目依赖安装成功。关闭当前xcode session,从此以后我们就使用.xcworkspace来打开我们的项目了。

第四步,编写RN页面

新建RN入口页面:index.ios.js。至于这里的文件名是否一定必须是index.ios.js,回答是否定的。你可以使用任意的文件名,只要后面在oc代码中指定同样的文件名就可以了。
比如你想使用business2.js做文件名,没问题,在后面的oc代码中指定好jsCodeLocation地址就可以了。这样就可以保证原生应用按照不同的业务场景嵌入不同的RN页面。

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


export default class Page1 extends Component {
  render() {
    return (
      <View style={{
          flex: 1,justifyContent: 'center',alignItems: 'center',backgroundColor: '#F5FCFF'}}>
        <Text>
          Welcome to React Native!
        </Text>
        <Text>
          To get started,edit index.ios.js
        </Text>
        <Text>
          Press Cmd+R to reload,{'\n'}
          Cmd+D or shake for dev menu
        </Text>
      </View>
    );
  }
}


AppRegistry.registerComponent('Page1',() => Page1);

第五步,原生页面调用RN页面

在ViewController.m中添加如图代码。 RCTRootView就是终极大法了。

第六步,运行

首先打开RN的package server:

npm start -- --reset-cache

然后xcode中运行项目。大功告成。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


react 中的高阶组件主要是对于 hooks 之前的类组件来说的,如果组件之中有复用的代码,需要重新创建一个父类,父类中存储公共代码,返回子类,同时把公用属性...
我们上一节了解了组件的更新机制,但是只是停留在表层上,例如我们的 setState 函数式同步执行的,我们的事件处理直接绑定在了 dom 元素上,这些都跟 re...
我们上一节了解了 react 的虚拟 dom 的格式,如何把虚拟 dom 转为真实 dom 进行挂载。其实函数是组件和类组件也是在这个基础上包裹了一层,一个是调...
react 本身提供了克隆组件的方法,但是平时开发中可能很少使用,可能是不了解。我公司的项目就没有使用,但是在很多三方库中都有使用。本小节我们来学习下如果使用该...
mobx 是一个简单可扩展的状态管理库,中文官网链接。小编在接触 react 就一直使用 mobx 库,上手简单不复杂。
我们在平常的开发中不可避免的会有很多列表渲染逻辑,在 pc 端可以使用分页进行渲染数限制,在移动端可以使用下拉加载更多。但是对于大量的列表渲染,特别像有实时数据...
本小节开始前,我们先答复下一个同学的问题。上一小节发布后,有小伙伴后台来信问到:‘小编你只讲了类组件中怎么使用 ref,那在函数式组件中怎么使用呢?’。确实我们...
上一小节我们了解了固定高度的滚动列表实现,因为是固定高度所以容器总高度和每个元素的 size、offset 很容易得到,这种场景也适合我们常见的大部分场景,例如...
上一小节我们处理了 setState 的批量更新机制,但是我们有两个遗漏点,一个是源码中的 setState 可以传入函数,同时 setState 可以传入第二...
我们知道 react 进行页面渲染或者刷新的时候,会从根节点到子节点全部执行一遍,即使子组件中没有状态的改变,也会执行。这就造成了性能不必要的浪费。之前我们了解...
在平时工作中的某些场景下,你可能想在整个组件树中传递数据,但却不想手动地通过 props 属性在每一层传递属性,contextAPI 应用而生。
楼主最近入职新单位了,恰好新单位使用的技术栈是 react,因为之前一直进行的是 vue2/vue3 和小程序开发,对于这些技术栈实现机制也有一些了解,最少面试...
我们上一节了了解了函数式组件和类组件的处理方式,本质就是处理基于 babel 处理后的 type 类型,最后还是要处理虚拟 dom。本小节我们学习下组件的更新机...
前面几节我们学习了解了 react 的渲染机制和生命周期,本节我们正式进入基本面试必考的核心地带 -- diff 算法,了解如何优化和复用 dom 操作的,还有...
我们在之前已经学习过 react 生命周期,但是在 16 版本中 will 类的生命周期进行了废除,虽然依然可以用,但是需要加上 UNSAFE 开头,表示是不安...
上一小节我们学习了 react 中类组件的优化方式,对于 hooks 为主流的函数式编程,react 也提供了优化方式 memo 方法,本小节我们来了解下它的用...
开源不易,感谢你的支持,❤ star me if you like concent ^_^
hel-micro,模块联邦sdk化,免构建、热更新、工具链无关的微模块方案 ,欢迎关注与了解
本文主题围绕concent的setup和react的五把钩子来展开,既然提到了setup就离不开composition api这个关键词,准确的说setup是由...
ReactsetState的执行是异步还是同步官方文档是这么说的setState()doesnotalwaysimmediatelyupdatethecomponent.Itmaybatchordefertheupdateuntillater.Thismakesreadingthis.staterightaftercallingsetState()apotentialpitfall.Instead,usecom