React-day03 RN移动端开发

了解React-Native

Facebook发起的开源的一套新的APP开发方案,Facebook在当初深入研究Hybrid开发后,觉得这种模式有先天的缺陷,所以果断放弃,转而自行研究,后来推出了自己的“React Native”方案,不同于H5,也不同于原生Native,更像是用JS写出原生应用

  • 优点
  1. 开发成本小于Native模式 Andriod-Java-Kotlin IOS-OC-Swift

  2. 性能体验高于Hybrid

  3. 一次学习,跨平台开发Android和iOS, 小程序

  4. 社区繁荣

  • 缺点
  1. 不同平台代码有所区别
  2. 开发人员学习有一定成本
  • 几种开发技术对比应用质量开发效率的平衡折衷的结果

了解React-Native工作流程

  1. 项目开发:使用Node初始化项目(需要安装Node),使用JavaScript/JSX语言开发
  2. 语言翻译:Python, C++将js翻译成java代码(需要安装Python2)
  3. 代码编译:Android-SDK将java编译成字节码(二进制),打包成可安装的apk(需要JDK8 & Android-SDK)
  4. 安装运行:通过Adb工具,把apk运行到Android模拟器

创建第一个React-Native项目 *

  • 安装脚手架react-native-cli 同时安装新的版包管理工具

    npm install -g yarn react-native-cli

  • 创建项目:doubanMovie(在不包含中文的目录执行)

    react-native init xxx --version react-native@0.55.4

  • 运行项目

    • 打开USB调试, 配置SDK

      • ANDROID_HOME=G:\Android-SDK
      • PATH=%PATH%;%ANDROID_HOME%\platform-tools
      • adb devices查看已连接设备
    • 连接模拟器: adb connect 127.0.0.1:62001

    • 更改gradle路径doubanMovie\android\gradle\wrapper\gradle-wrapper.properties

      • distributionUrl值修改为file\:///E:/Lesson/bc1/React/day03/Resource/gradle-2.14.1-all.zip 直接复制过来的路径要把反斜线\改成正斜线/
    • 在项目根目录执行react-native run-android

      运行期间会开启一个Node服务,不要关闭

    • 第一次运行报错,需要在设备上设置app的Node服务地址

      解决方式: 打开app > 菜单按钮 > Dev Settings -> Debug server host ...

      填写服务ip和端口号, 注意冒号用英文半角,重启服务,重启应用

了解React-Native项目及结构

  • 目录结构

    • index.js 项目入口文件
    • App.js 项目根组件,用户看到的首页组件
    • package.json 项目配置文件
    • app.json 配置项目名称
  • React-Native与React对比

    • 组件写法

      RN提供View,Text组件,没有html的dom元素

      View -> div 布局容器

      Text -> p 显示文字

    • 样式写法

      使用const styles = StyleSheet.create({...})

  • React-Native平台相关代码处理

    const instructions = Platform.select({
    ios: 'Press Cmd+R to reload,\n Cmd+D or shake for dev menu',
    android: 'Double tap R on your keyboard to reload,\n',
    });

开发资料

项目开发

路由(react-native-router-flux)

  • react-native-router-flux

  • 源码地址:https://github.com/aksonov/react-native-router-flux

    应用场景:在RN项目中进行路由跳转时使用

    安装方式:yarn add react-native-router-flux

  • 使用:

    Router(路由): 一般写在项目的根组件

    Stack (栈):给Scene场景提供容器

    Scene(场景):设置路由跳转规则

    Actions (动作):触发路由跳转

    const App = () => (
    <Router>
    <Stack key="root">
    <Scene key="login" component={Login} title="Login"/>
    <Scene key="register" component={Register} title="Register"/>
    <Scene key="home" component={Home}/>
    </Stack>
    </Router>
    );

    注意事项:

  • 最新版的react-native-router-flux会在react-native 0.55.4版本出现isMounted(...)警告,可在App.js添加以下代码忽略警告。随后两个框架更新后,此警告也可消除。

    import { YellowBox } from 'react-native'
    YellowBox.ignoreWarnings(['Warning: isMounted(...) is deprecated'])
  • 触发路由:三种方式 (注意导入Actions组件)

    <Text onPress={Actions.movieList}>电 影</Text>
    <Text onPress={() => { Actions.movieList()}}>电 影</Text>
    <Text onPress={() => { Actions['about'].call() }}>关 于</Text>
  • 弹性布局参考: http://www.runoob.com/w3cnote/flex-grammar.html

开发组件(swiper)

  • 开源轮播图react-native-swiper

  • 源码地址:https://github.com/leecade/react-native-swiper

    应用场景:在首页展示轮播图

    安装方式:yarn add react-native-swiper

  • 常用属性:

    index={1} 					默认位置, 从0开始
    showsButtons={true} 是否显示按钮
    autoplayTimeout={2.5} 自动播放停留时间
    autoplay={true} 是否自动播放
    showsPagination={true} 显示分页指示器

网络请求(fetch) *

  • Axios
  • fetch
  • componentDidMount执行请求并在回调中执行setState
    // 组件已经挂载
    componentDidMount() {
    const url = 'http://api.douban.com/v2/movie/in_theaters';
    fetch(url).then(res => res.json())
    .then(data => {
    // 处理网络json数据
    this.setState({
    isLoading: false,
    movieList: data.subjects
    })
    // console.warn(data.subjects)
    }).catch((err) => {
    console.error(err);
    });
    }

长列表(FlatList) *

  • 长列表优化

    <FlatList
    data={this.state.movieList}
    keyExtractor={(item, index) => item.id}
    renderItem={({ item, index }) => {
    return (
    <View style={{ padding: 10, flexDirection: 'row' }}>
    <Text>{item.title}: {item.year} : {index} </Text>
    </View>
    )
    }}
    />
  • 加载指示器

    <View style={{ flex: 1, padding: 20 }}>
    <ActivityIndicator />
    </View>
  • 条目点击跳转

Actions.movieDetail({ "movieId": movie.id, "movieTitle": movie.title});

滚动视图(ScrollView)

  • 发送网络请求
  • 渲染视图

日志与调试

  • 查看RN日志:

    react-native log-ios
    react-native log-android

    android也可在PC控制台输入

    adb logcat *:S ReactNative:V ReactNativeJS:V

  • 应用内的错误与警告

    console.warn('Yellow.');
    console.error('Red.');
  • Debug调试

    • Chrome开发者工具
    1. 在Android设备菜单中选择“Debug JS Remotely”,PC会自动通过Chrome浏览器打开调试页面 http://localhost:8081/debugger-ui (需要自行安装Chrome)。这里注意自动打开的主机地址可能不是localhost,需要手动改成localhost (不修改,则手机页面可能是空白)

    2. 在Chrome浏览器按Ctrl + Shift + IF12打开控制台

    3. 选中Sources选项卡 -> Network标签 -> debuggerWorker.js 打开指定组件文件即可

    4. 如果没有没有debuggerWorker.js, 查看页面最下边的Status提示。

      Status: Another debugger is already connected

      另一个调试器已连接,直接使用或关闭那个调试器

      Status: Waiting, press Ctrl R in simulator to reload and connect.

      等待中,建议重新加载模拟器

    5. 可以在代码中打断点,Console中执行js代码打印变量、执行脚本

    6. 关闭调试:在Android设备菜单中选择“Stop Remote JS Debugging”即可

打包及发布


今天所有安装的包

  1. react-native-router-flux 路由

    应用场景:在RN项目中进行路由跳转时使用

    安装方式:yarn add react-native-router-flux

  2. react-native-swiper 开源轮播图

    应用场景:在首页展示轮播图

    安装方式:yarn add react-native-swiper

React03 移动端跨平台开发的更多相关文章

  1. JSBridge框架解决通信问题实现移动端跨平台开发

    一.跨平台开发是趋势 目前主流的移动端平台主要是Android和iOS,为了尽可能复用代码和节省开发成本,各大巨头都开发了自己的跨平台框架,比如Facebook的React-Native.阿里的Wee ...

  2. 移动端跨平台方案对比:React Native、weex、Flutter

    跨平台一直是老生常谈的话题,cordova.ionic.react-native.weex.kotlin-native.flutter等跨平台框架百花齐放,颇有一股推倒原生开发者的势头. 为什么我们需 ...

  3. 最火移动端跨平台方案盘点:React Native、weex、Flutter

    1.前言 跨平台一直是老生常谈的话题,cordova.ionic.react-native.weex.kotlin-native.flutter等跨平台框架的百花齐放,颇有一股推倒原生开发者的势头. ...

  4. 跨平台移动端APP开发---简单高效的MUI框架

    MUI是dcloud(数字天堂)公司旗下的一款跨平台开发移动APP的框架产品,在学习MUI框架之前,最先接触了Hbuilder代码编辑器,它带给我的第一感觉是快,这是HBuilder的最大优势,通过完 ...

  5. 简述移动端IM开发的那些坑:架构设计、通信协议和客户端

    1.前言 有过移动端开发经历的开发者都深有体会:移动端IM的开发,与传统PC端IM有很大的不同,尤其无线网络的不可靠性.移动端硬件设备资源的有限性等问题,导致一个完整的移动端IM架构设计和实现都充满着 ...

  6. 移动端IM开发需要面对的技术问题

    1.前言 这两年多一直从事网易云信 iOS 端 IM SDK的开发,期间不断有兄弟部门的同事和合作伙伴过来问各种技术细节,干脆统一介绍下一个IM APP的方方面面,包括技术选型(包括通讯方式,网络连接 ...

  7. Flutter 实现原理及在马蜂窝的跨平台开发实践

    一直以来,跨平台开发都是困扰移动客户端开发的难题. 在马蜂窝旅游 App 很多业务场景里,我们尝试过一些主流的跨平台开发解决方案, 比如 WebView 和 React Native,来提升开发效率和 ...

  8. 利用Delphi-cross-socket 库提升kbmmw 跨平台开发

    以前我写过了,通过httpsys 提升windows 下,delphi 多层应用.随着delphi 10.2 对linux 的支持,很多人也想在linux 下 发布kbmmw 服务器,但是官方仅通过i ...

  9. 浅谈移动应用的跨平台开发工具(Xamarin和React Native)

    谈移动应用的跨平台开发不能不提HTML5,PhoneGap和Sencha等平台一直致力于使用HTML5技术来开发跨平台的移动应用,现在看来这个方向基本算是失败的,基于HTML5的移动应用在用户体验上与 ...

随机推荐

  1. axios 二进制流导出

    axios 二进制流导出 axios({ url: 'http://xxx', method:'get', data:{}, headers:{ 'ContentType': 'application ...

  2. 大白话讲解BP算法(转载)

    最近在看深度学习的东西,一开始看的吴恩达的UFLDL教程,有中文版就直接看了,后来发现有些地方总是不是很明确,又去看英文版,然后又找了些资料看,才发现,中文版的译者在翻译的时候会对省略的公式推导过程进 ...

  3. runit git-daemon-run 等错误

    正在处理用于 man-db (2.7.5-1) 的触发器 ... 正在设置 runit (2.1.2-3ubuntu1) ... start: 无法连接到 Upstart: Failed to con ...

  4. SpringBoot学习10:springboot整合mybatis

    需求:通过使用 SpringBoot+SpringMVC+MyBatis 整合实现一个对数据库中的 t_user 表的 CRUD 的操作 1.创建maven项目,添加项目所需依赖 <!--spr ...

  5. 触发ionic弹窗区域外的方法

    最近项目需要在页面弹窗的时候需要点击弹窗区域外的地方,其实也就是点击页面HTML就可以关闭弹窗, 首先在controller通过js获取到html的dom节点,然后绑定点击事件,话不多说上代码:   ...

  6. OCCI线程安全

    线程是任务调度的基本单位,一个进程中可以有多个线程,每个线程有自己的堆栈空间, 进程中的代码段.数据段和堆栈对进程中的线程是可见的.在使用线程时通常都要考虑数据的安全访问. 常用的线程同步方法有: 互 ...

  7. 1189: [HNOI2007]紧急疏散evacuate

    Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3831  Solved: 1119[Submit][Status][Discuss] Descript ...

  8. Java分享笔记:File类中常用方法的介绍

    java.io包下的File类用于描述和创建一个文件或文件夹对象,只能对文件或文件夹做一些简单操作,不能修改文件的内容,功能比较有限.下面是对于File类中常用方法的程序演示. [1] 演示程序一 p ...

  9. LeetCode-177:第N高的薪水

    第N高的薪水与第二高的薪水,解题思路是一样的,只要对LeetCode-176的SQL做一下变形,便可以满足这题,详见:https://www.cnblogs.com/zouqf/p/10282392. ...

  10. Navicat Premium Mac 12 破解

    破解地址:https://blog.csdn.net/xhd731568849/article/details/79751188 亲测有效