ReactNative For Android 之二:基本组件和API
系列文章:
ReactNative For Android 之一:环境搭建
ReactNative For Android 之二:基本组件和API
ReactNative For Android 之三:工程结构
ReactNative For Android 之四:自定义组件
ReactNative For Android 之五:自定义module
ReactNative For Android 之六:组件生命周期
一.基本组件
1.DrawerLayoutAndroid
-
drawerPosition:可以用DrawerLayoutAndroid的静态属性positions里的Left或Right指定
-
renderNavigationView:drawer的view
-
onDrawerClose/Open:关闭与打开drawer时的回调方法
-
keyboardDismissMode:键盘隐藏方式(on-drag是在拖动时隐藏键盘)
-
drawerWidth:drawer的宽度
-
< DrawerLayoutAndroid> 之间放置的是主页面的view < /DrawerLayoutAndroid>
2.Image
-
resizeMode:缩放模式(cover:缩放至占满整个image即可 contain:缩放至包含即可 stretch:拉伸)
-
source:图片来源,两中途径
-
source={{uri:’’}}:uri路径
-
source={require(’…/xxx’)}:本地资源的相对路径
-
-
gif/base64图片也可直接加载
-
ios中还可以有默认占为图,图片加载过程的回调等,android的debug版本暂不支持
3.ListView
-
dataSource:数据,listview需要是个数组,创建时,需要用ListView.DataSource来包装数据集合,如:
var dataSource = new ListView.DataSource({ rowHasChanged:(row1,row2) => row1!==row2, }).cloneWithRows(data);
-
renderRow:绘制item的方法,会传入数组元素进去
-
onEndReached:到达底部时执行的回调,可用来实现加载功能
-
onEndReachedThreshold:设置距离底部多少距离时当成到达底部,触发onEndReached
-
renderFooter/Header/Separate:绘制底部头部和分割线
也可实现ExpandableListView
- dataSource:比较麻烦,需要三个数据集合:
-
sectionIDs:sectionID的数组 如:[‘s1’,‘s2’]
-
rowIDs:rowID的数组,每个元素也是一个数组,对应的都是相应section的所有rowID 如:[[‘r1’],[‘r1’,‘r2’]]
-
dataBlob:总得数据对象,有sectionID:对应的值,还有(sectionID和对应的每个rowID以某种格式拼起来的key):对应的值 如:{‘s1’:‘s1v’ , ‘s2’:‘s2v’ , ‘s1-r1’:‘s1r1v’ , ‘s2-r1’:‘s2r1v’ , ‘s2-r2’:‘s2r2v’}
-
renderSectionHeader:绘制每个section头部的方法,会传入sectionDate
-
renderRow:会传入dataBlob,rowID和sectionID,通过当初构建数据的方式用两个id再取出来相应的值进行设置即可
4.Navigator
navigator作为一个导航器,可以用来跳转界面,相当于一个栈来管理所有的界面,每个界面是一个route对象,这个对象由自己定义,要有一个属性来唯一区分即可,一般可以设置一个组件,一个数据等等
-
initialRoute:初始界面
-
renderScene:绘制每个界面时的方法,会传入需要绘制的route(可以取出想要的东西来进行处理)和当前的navigator对象(可以接着往下传)
5.ProgressBarAndroid
-
indeterminate:只是滚动没用完成度那样的进度条
-
styleAttr:样式(大的小的横向的)
-
progress:进度值0~1
6.PullToRefreshAndroid
下拉刷新控件(android自带的刷新控件),<>放入view即可</>
-
refreshing:刷新状态,决定圆圈是否显示
-
onRefresh:刷新方法
-
colors:进度圈的颜色变化
-
progressBackgroundColor:进度圈的背景
-
enable:是否能用刷新功能
7.ScrollView
ios还支持刷新功能,android暂不支持
在<></>内放入子view即可,但切记只能放入一个子view(和android一样)
8.TextInput
-
placeholder相关:hint想关
-
underlineColorAndroid:底下线的颜色
-
keyboardType:键盘类型
-
onSubmitEditing:点击完成后的回调
还有获取焦点,默认值,多行,最大长度,对齐方式,书写位置等属性
9.ToolbarAndroid
-
actions:指定的action对象数组,每个对象可以包含title,icon,show等属性
-
navIcon:左侧的导航按钮
-
title:标题
-
onAction/IconSelected:action和导航按钮的点击回调
10.ViewPagerAndroid
-
initialPage:初始页索引
-
onPageScroll:翻页过程中的回调e.nativeEvent:{position,offset}
-
onPageSelected:切换的回调e.nativeEvent.position
<></>内部写view的数组即可
这里需要注意,一个同一组件的数组需要为每个组件传个唯一值的key属性来区分,否则报warning
数组中对每个组件要指定key属性来确保渲染顺序,不能有数字型,否则会被按照大小排序,字符串即可
11.Touchable
有各种回调,能设置按下的颜色和透明度
-
TouchableHighlight只能有一个child,按下时相当于添加了额外的view来变化颜色
-
TouchableNativeFeedback可以调用native的drawable绘制,下一阶段研究
-
TouchableOpacity简单的改变透明度,不用添加额外的view
-
TouchableWithoutFeedback一般不要用,点击后所有的元素都会有虚拟的响应,造成像web app一样的感觉
12.Text
当嵌套在一起时,内部的text会继承外面的样式,并且可以有自己的样式,且紧跟在外面text的后面显示,这样就相当于android的spinnerText了
- onPress:点击事件
13.View
最基本的容器组件,可以指定整个view的布局方向等属性,也有最基本的style样式
二.API
1.AppRegistry
-
AppRegistry是JS运行所有React Native应用的入口。
-
AppRegistry应当在require序列中尽可能早的被require到,以确保JS运行环境在其它模块之前被准备好。
-
应用的根组件应当通过
AppRegistry.registerComponent
方法注册自己,然后原生系统才可以加载应用的代码包并且在启动完成之后通过调用AppRegistry.runApplication
来真正运行应用。 -
要“结束”一个应用并销毁视图的话,调用
AppRegistry.unmountApplicationComponentAtRootTag
方法,参数为在runApplication中使用的标签名。 -
AppRegistry.getAppKeys();为一个数组,包含了注册的组件的tag名
2.StyleSheet
StyleSheet提供了一种类似CSS样式表的抽象。
-
从代码质量角度:
-
从render函数中移除具体的样式内容,可以使代码更清晰易懂。
-
给样式命名也是对render函数中的原始组件的作用的一种标记。
-
-
从性能角度:
-
创建一个样式表,就可以使得我们后续更容易通过ID来引用样式,而不是都创建一个新的对象。
-
它还使得样式只会在JavaScript和原生之间传递一次,随后的过程都可以只传递一个ID(这个优化还未实现。
-
3.BackAndroid
在MainActivity的里注册了点击back按钮时的事件会交由js处理,所以js里可以捕获到,当处理完后返回true则结束处理,false则继续交由native系统处理
4.ToastAndroid
ToastAndroid.show(msg,ToastAndroid.SHORT/LONG);
是个自定义的module(后面会讲)方法,会调用android的Toast来输出信息
5.NetWork
fetch为最基本的异步网络请求,可以传入URL并构建method,headers,body等参数格式
第一个then拿到response,将其转换成json(.json)或者文本(.text())
第二个then拿到最终的数据去处理
done为结束请求
还可以用catch来捕获异常
注意
往往异步任务回来后处理state时,当前页面可能已经关掉,这是再去处理就会报warning,这时可以用this.isMounted()来判断是否还存在界面,相当于android的isFinishing().
此外还有WebSocket全双工请求方式和XMLHttpRequest兼容性高的请求方式。