在windows上开发react-native已经有一些时候了。作为一个Android原生开发者,在开发的过程中,虽然有点蛋疼,但毕竟积累了一点点经验,再不说出来,我就要侧漏了......

1,前言

react-native开发使用的是JS,但是并不是纯正的JS,而是一种JSX语言,就是在JS中嵌入XML语言,因此,只要有一些JS的语法基础的原生开发者,就可以肯容易理解JSX的语法了,在RN中,推荐使用ES6的语法。

对于JS而言,一切皆对象,函数也是对象,而对象的内部是通过key-value的形式来组成的,也可以说是通过json格式来组成。对象内部每一个键值对(key:value)称作一个属性(RN中最重要的属性是state和props)。

2,性能

使用react-native开发的最大的有点在于开发效率,加入APP并不复杂的话,那么完全可以使用纯JS开发,也就是Android和iOS公用一套界面和逻辑。极大的提高了开发效率。在性能上,(Android中一般的操作)RN的表现比原生弱一些,但是远好于H5。所以总体来看,其实RN的未来还是可以期待的。

3,RN运行机制简述

RN是运行JS的,Android是运行Java字节码的,所以,实际上JS代码的最终运行是通过一层封装,把JS的代码映射成原生代码,而界面上的元素最终使用的也是原生的组件,而不是自己渲染(所以在性能上,RN比H5要好很多)。

4,Component简介

在Android中,主要交互容器是activity或Fragment,而在RN中,界面的交互容器是Component:组件。我觉得Component和原生的Fragment其实很像,都存在于activity中,都受制于activity的生命周期,都可卸载和装载。

4.1,Component生命周期

由上图可知,大致分三个过程:初始化,运行中,卸载。

  • 初始化阶段:

    • 在新版的Component中ES6语法中,getDefaultProps,getInitialState 是不应该被复写的。RNAPI要求我们props,state的初始化在Component的constructor函数中完成(props,state这俩大宝贝下文在做解释),因此在初始化阶段可以做的就是在constructor或者componentDidMount函数中完成相关初始化工作。
    • componentDidMount函数是组件第一次绘制完成之后被调用的,整个周期只被调用一次,在这里可以做一些网络请求操作等。
  • 运行阶段:
    • 重点在于修改state内容,来刷新界面
  • 卸载阶段
    • 在componentWillUnmount方法中做一些移除操作,或者什么都不做。

在这里,已经有前辈写出了比较详细的博文了,有兴趣请前往React Native 中组件的生命周期。

4.2,state和 prop

这两个属性之所以重要,是因为stat和界面的刷新有关,prop则和组件的封装有关。

state初始化在构造函数中,通过setState来修改里面具体的值。具体如下:

而修改state内容则是这样:

当state中的内容被修改后,当前组件就会按照生命周期来刷新页面,这样,所有和界面刷新的任务就全部交到state这一个属性手里了。这是一个很不错的设计。

而prop这个属性,则是用于封装组件的时候对外暴露组件的可输入属性。即就像这样:

就这样,封装组件中的所有你想暴露给别人输入的属性都可以定义在prop之中。

4.3,component间的跳转

在原生开发中,界面的跳转主要依赖Intent作为桥梁,而在RN中,则全部依靠Navigator这个组件来实现页面之间的跳转逻辑。

  • initRoute这个属性指定了初始化的页面,在这个例子中,进入第一屏的页面将是TabBarView,
  • configureScene这个属性用于指定默认跳转动画
  • renderScene这个属性传入的是一个方法,根据得到的不同的组件(component)来渲染不同的场景。

Navigator这个导航器是全局的,整个APP中只有一个,会根据界面的跳转传递到每个Component内部的prop中。Navgator会维护一个栈,这一点和原生的Activity的任务栈极其相似,可以对照理解。

  • 数据传递 上面的代码中有这样一段:
< Component navigator = {navigator} route = {route}{...route.passProps} />复制代码

{...route.passProps}保证passProps里每个key都会被视作prop的一个属性,具体如下:

跳转到SecondPageComponent界面

navigator.push({name: 'SecondPageComponent',component: SecondPageComponent,passProps: {   //注意passProps和之前定义的保持一致msg:'ladingwu is handsome'}
});复制代码

而在SecondPageComponent界面界面中,这样来取数据:

export default class SecondPageComponent extends React.Component {componentDidMount() {//这里获取传递过来的参数var message=this.prop.msg;}
}复制代码

怎么样,简单极了吧。当然,在原生开发中,还有startActivityForResylt()这个方法可以再从第二个界面返回时获取数据,那么在RN中是否能做到呢?也很简单,依然是通过传递参数,只不过这个时候的参数,应该是一个回调函数(js中,函数也可以当作参数,一切皆对象)

跳转到SecondPageComponent界面

navigator.push({name: 'SecondPageComponent',component: SecondPageComponent,passProps: {   //注意passProps和之前定义的保持一致getMsg:(msg)=>{console.log(msg)}}
});复制代码

而在SecondPageComponent界面界面中返回数据:

export default class SecondPageComponent extends React.Component {componentDidMount() {//这里获取传递过来的参数this.prop.getMsg('ladingwu is still handsome');}
}复制代码

不要太简单哦。。。。

5,总结

当然,RN还有很多可以说的,比如动画(性能有点感人),网络请求,数据存储等等,就不一一举例说明了。

说一点感想,使用RN开发这段时间,感觉这玩儿确实可以提高工作效率,毕竟Android和iOS使用一套界面,而且很多功能在RN上都有完备的实现,基本上,只要APP的业务逻辑不复杂,或者并不涉及到很多硬件操作或对性能要求很高的话,使用纯RN开发是完全可以的。假如H5是未来的话,那么在未来来临之前,RN才是更好的选择,当然,RN并不能完全取代原生开发,因为它只是在原生和H5之间找平衡的产物,它当然好,但也不是最优解。

你是不是该学?

应该,即使只是冲着JS也要去学一把,如今,JS不仅霸占了web端,还入侵了移动端和后台开发,我就问你怕不怕?


最后推荐几个学习RN必备网站:

React-Native中文站(非官方)

React-Native官方网站

江清清的技术专栏

google搜索引擎

react-native 开发小结(Android)相关推荐

  1. Windows下React Native开发01 -- Android开发环境搭建

    1.安装jdk 推荐将JDK的bin目录加入系统PATH环境变量(自己百度下怎么配置). 2.安装SDK 直接安装 Android Studio  推荐从AndroidDevTools下载.(也可以直 ...

  2. react native开发Android 篇——集成自定义的字体

    react native开发Android 篇--集成自定义的字体 第一种:link添加自定义字体 第二种:直接复制字体到`android/app/src/main/assets/fonts`目录下 ...

  3. react native开发Android 篇——APP名称、图标、启动页

    react native开发Android 篇--APP名称.图标.启动页 设置APP名称 设置APP图标 设置启动页 隐藏启动页 设置APP名称 编辑 android/app/src/main/re ...

  4. 从 Android 到 React Native 开发(四、打包流程解析和发布为 Maven 库 )

    1.从 Android 到 React Native 开发(一.入门) 2.从 Android 到 React Native 开发(二.通信与模块实现) 3.从 Android 到 React Nat ...

  5. 【转】【React Native开发】

    [React Native开发]React Native控件之ListView组件讲解以及最齐全实例(19)  [React Native开发]React Native控件之Touchable*系列组 ...

  6. windows 下配置 react native 开发环境

    windows 下配置 react native 开发环境 安装nvm 由于react native 需要使用 NodeJs 4.0以上版本,为了方便切换NodeJs,首先我们需要安装nvm. 你可以 ...

  7. React Native开发之必备React基础

    为了帮助大家快速上手React Native开发,在这本节中将向大家介绍开发React Native所需要的一些React必备基础知识. 概述 本节课将从React的特点.如何使用React.JSX语 ...

  8. React Native开发错误警告处理总结(已解决 !持续更新)

    注:本文是我在开发过程中遇到问题解决方法的总结,之后会持续更新,希望帮助到更多的学习者.文中有不妥的地方希望指出共同学习,同时欢迎大神补充.(之后我会放出自己开发整理的笔记和GithubDemo地址, ...

  9. Windows环境下安装React Native开发环境----记一次填坑过程

    前言 集成React Native开发环境遇到各个坑,调试了很久出现过找不到设备,百度上个别人的资料有误被绕来绕去耽误了很多时间,下载慢等待时间过长等问题,最后多方查阅资料,电脑重启等操作终于部署好了 ...

  10. react native实现兼容Android与ios的视频播放器

    呦吼-,我来啦,这是我的第一篇文章,当然是福利啦,项目代码可以直接运行使用的呀,这种便宜尽情挥霍去吧-.好了装嫩结束,来点实际的,这个项目其实是我主讲的一门视频课程(看文章就可以学到所有知识,若需要可 ...

最新文章

  1. leetcode -- 3 sum
  2. Python_Nginx
  3. 微信小程序-04-详解介绍.json 配置文件
  4. mezzanine安装配置
  5. 三方协议,档案,工龄,保险,户口,
  6. Spring 基于设值函数的依赖注入
  7. 观察者模式在JDK应用中的源码分析
  8. Flowable学习笔记(一、入门)
  9. Java:这是一份全面 详细的 Synchronized关键字 学习指南
  10. 计算机科学与技术专题,专题四 计算机科学与应用技术.ppt
  11. Android 功耗(18)---android省电和提高效率
  12. Polylink 智能话机之—— e-talk 2200
  13. Trick(十二)——统计 label(序列)各个标签值出现的次数以及出现次数最多的标签
  14. LLVM每日谈之三 如何创建一个LLVM工程
  15. USB接口的TP概率性不工作需重启才恢复问题定位
  16. 【luogu T34117 打油门】 题解
  17. android图片视频图片封装,详解android 视频图片混合轮播实现
  18. dubbo如何利用spring扩展点完成初始化
  19. android office转pdf插件,Office自带Word转PDF插件 让office的另存为可存储为PDF文件
  20. BScroll 实时监听滚动位置

热门文章

  1. 对话农民丰收节交易会-林裕豪:从玉农业2021新年贺词
  2. VC++深入详解 孙鑫 高清PDF + 配套视频下载
  3. mysql基础(全,必看)
  4. VS Code 的常用快捷键和插件
  5. templates的语法
  6. codevs 1373 射命丸文
  7. mysql binlog日志的三种模式
  8. iOS7 UIKit Dynamics 的初步研究
  9. To B路上,除了服务管理,还要知识管理
  10. 12小时紧急策划 复盘一篇10W+的诞生全历程