react-native 开发小结(Android)
在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)相关推荐
- Windows下React Native开发01 -- Android开发环境搭建
1.安装jdk 推荐将JDK的bin目录加入系统PATH环境变量(自己百度下怎么配置). 2.安装SDK 直接安装 Android Studio 推荐从AndroidDevTools下载.(也可以直 ...
- react native开发Android 篇——集成自定义的字体
react native开发Android 篇--集成自定义的字体 第一种:link添加自定义字体 第二种:直接复制字体到`android/app/src/main/assets/fonts`目录下 ...
- react native开发Android 篇——APP名称、图标、启动页
react native开发Android 篇--APP名称.图标.启动页 设置APP名称 设置APP图标 设置启动页 隐藏启动页 设置APP名称 编辑 android/app/src/main/re ...
- 从 Android 到 React Native 开发(四、打包流程解析和发布为 Maven 库 )
1.从 Android 到 React Native 开发(一.入门) 2.从 Android 到 React Native 开发(二.通信与模块实现) 3.从 Android 到 React Nat ...
- 【转】【React Native开发】
[React Native开发]React Native控件之ListView组件讲解以及最齐全实例(19) [React Native开发]React Native控件之Touchable*系列组 ...
- windows 下配置 react native 开发环境
windows 下配置 react native 开发环境 安装nvm 由于react native 需要使用 NodeJs 4.0以上版本,为了方便切换NodeJs,首先我们需要安装nvm. 你可以 ...
- React Native开发之必备React基础
为了帮助大家快速上手React Native开发,在这本节中将向大家介绍开发React Native所需要的一些React必备基础知识. 概述 本节课将从React的特点.如何使用React.JSX语 ...
- React Native开发错误警告处理总结(已解决 !持续更新)
注:本文是我在开发过程中遇到问题解决方法的总结,之后会持续更新,希望帮助到更多的学习者.文中有不妥的地方希望指出共同学习,同时欢迎大神补充.(之后我会放出自己开发整理的笔记和GithubDemo地址, ...
- Windows环境下安装React Native开发环境----记一次填坑过程
前言 集成React Native开发环境遇到各个坑,调试了很久出现过找不到设备,百度上个别人的资料有误被绕来绕去耽误了很多时间,下载慢等待时间过长等问题,最后多方查阅资料,电脑重启等操作终于部署好了 ...
- react native实现兼容Android与ios的视频播放器
呦吼-,我来啦,这是我的第一篇文章,当然是福利啦,项目代码可以直接运行使用的呀,这种便宜尽情挥霍去吧-.好了装嫩结束,来点实际的,这个项目其实是我主讲的一门视频课程(看文章就可以学到所有知识,若需要可 ...
最新文章
- leetcode -- 3 sum
- Python_Nginx
- 微信小程序-04-详解介绍.json 配置文件
- mezzanine安装配置
- 三方协议,档案,工龄,保险,户口,
- Spring 基于设值函数的依赖注入
- 观察者模式在JDK应用中的源码分析
- Flowable学习笔记(一、入门)
- Java:这是一份全面 详细的 Synchronized关键字 学习指南
- 计算机科学与技术专题,专题四 计算机科学与应用技术.ppt
- Android 功耗(18)---android省电和提高效率
- Polylink 智能话机之—— e-talk 2200
- Trick(十二)——统计 label(序列)各个标签值出现的次数以及出现次数最多的标签
- LLVM每日谈之三 如何创建一个LLVM工程
- USB接口的TP概率性不工作需重启才恢复问题定位
- 【luogu T34117 打油门】 题解
- android图片视频图片封装,详解android 视频图片混合轮播实现
- dubbo如何利用spring扩展点完成初始化
- android office转pdf插件,Office自带Word转PDF插件 让office的另存为可存储为PDF文件
- BScroll 实时监听滚动位置