记住ScrollView必须有一个确定的高度才能正常工作,因为它实际上所做的就是将一系列不确定高度的子组件装进一个确定高度的容器(通过滚动操作)
要给一个ScrollView确定一个高度的话,要么直接给它设置高度(不建议),要么确定所有的父容器都有确定的高度
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 horizontal bool showsHorizontalScrollIndicator bool showsVerticalScrollIndicator bool alwaysBounceHorizontal bool refreshControl element (ios) alwaysBounceVertical bool (ios) automaticallyAdjustContentInsets bool (ios) bounces bool (ios) bouncesZoom bool (ios) contentInset {top: number, left: number, bottom: number, right: number} (ios) contentOffset PointPropType pagingEnabled bool scrollEnabled bool (ios) scrollEventThrottle number (ios)scrollIndicatorInsets {top: number, left: number, bottom: number, right: number} (ios) scrollsToTop bool stickyHeaderIndices [number] (ios) maximumZoomScale number (ios) minimumZoomScale number
开发中,常需要在滚动的时候做事情,那怎么监听ScrollView滚动
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 onMomentumScrollBegin={this ._onMomentumScrollBegin.bind(this )} onMomentumScrollEnd={this ._onMomentumScrollEnd.bind(this )} onScrollBeginDrag={this ._onScrollBeginDrag.bind(this )} onScrollEndDrag={this ._onScrollEndDrag.bind(this )} onScrollAnimationEnd={this ._onScrollAnimationEnd.bind(this )} onMomentumScrollStart?: function onMomentumScrollEnd?: function onScroll={this ._onScroll.bind(this )} scrollEventThrottle={1 } scrollTo(y: number | { x?: number, y?: number, animated?: boolean }, x: number, animated: boolean) scrollTo({x: 0 , y: 0 , animated: true }) scrollToEnd(options?)
获取原生事件
滚动的时候,会传入一个合成事件作为监听滚动方法的参数,每个方法都会有这个合成事件
通过合成事件能获取原生事件nativeEvent
,原生事件nativeEvent
会有我们想要的信息.
什么是合成事件:在RN中,事件的处理由其内部自己实现的事件系统完成,触发的事件都叫做 合成事件(SyntheticEven
t)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 _onMomentumScrollEnd(e){ var nativeEvent = e.nativeEvent var contentX = nativeEvent.contentOffset.x var page = contentX / kScreenWidth this .setState({ currentPage:page }) }
ListView
官方文档提示: 在0.46版本开始此组件已过期, 并推荐使用FlatList
或SectionList
替代, 但是在0.51版本依然可以使用
ListView
: 一个核心组件,用于高效地显示一个可以垂直滚动的变化的数据列表
ListView内部是通过ListViewDataSource
这个对象,显示数据,因此使用ListView必须先创建ListViewDataSource
对象。
ListViewDataSource
构造方法(创建对象):可选择性传入4个参数,描述怎么提取数据,怎么刷新cell
这些参数:都是函数,当产生对应的事件的时候,会自动执行这些函数.
ListView常用的属性和方法
ListView可以使用所有ScrollView的属性。
1 2 3 4 5 initialListSize number dataSource ListViewDataSource
ListViewDataSource
构造函数可以接受下列四种参数(都是可选):
1 2 3 4 5 6 7 8 getRowData(dataBlob, sectionID, rowID); getSectionHeaderData(dataBlob, sectionID); rowHasChanged(prevRowData, nextRowData); sectionHeaderHasChanged(prevSectionData, nextSectionData);
ListViewDataSource
为ListView
组件提供高性能的数据处理和访问。我们需要调用clone方法从原始输入数据中抽取数据来创建ListViewDataSource
对象。
要更新datasource
中的数据,请(每次都重新)调用cloneWithRows
方法(如果用到了section,则对应cloneWithRowsAndSections
方法)clone方法会自动提取新数据并进行逐行对比(使用rowHasChanged
方法中的策略),这样ListView
就知道哪些行需要重新渲染了
注意:初始化ListViewDataSource
的时候,如果不需要修改提取数据的方式,只需要实现rowHasChanged
,告诉什么时候刷新下一行数据.
注意:默认ListViewDataSource
有提取数据方式,可以使用默认的提取方式.
ListView使用步骤
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 var datas = new ListView.DataSource({ rowHasChanged: (r1, r2)=>{r1 != r2}, }) var foodArr = require('./Resource/food.json' ) datas = datas.cloneWithRows(foodArr) this .state = { dataArr: datas }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 <ListView style={{backgroundColor:'white' , marginTop:20 }} dataSource={this .state.dataArr} renderRow={this ._renderRow.bind(this )} renderHeader={this ._renderHeader.bind(this )} renderSectionHeader={this ._renderSectionHeader.bind(this )} renderFooter={this ._renderFooter.bind(this )} renderSeparator={this ._renderSeparator.bind(this )} />
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 _renderRow(rowData, sectionID, rowID, highlightRow) { return ( <View> <Text>{rowData}</Text> </View> ); }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 _renderHeader() { return ( <View> <Text>头部视图</Text> </View> ) } _renderFooter() { return ( <View> <Text>尾部视图</Text> </View> ) }
renderSectionHeader: 设置每一个section的头部样式
1 2 3 4 5 _renderSectionHeader(sectionData, sectionID){ }
1 2 3 4 5 6 7 _renderSeparator(sectionID, rowID, adjacentRowHighlighted) { console.log(sectionID,rowID,adjacentRowHighlighted); return ( <View style={{height:1 ,backgroundColor:'black' }}></View> ) }
SectionList 高性能的分组(section)列表组件,支持下面这些常用的功能:
完全跨平台。
行组件显示或隐藏时可配置回调事件。
支持单独的头部组件。
支持单独的尾部组件。
支持自定义行间分隔线。
支持分组的头部组件。
支持多种数据源结构
支持下拉刷新。
支持上拉加载。
如果你的列表不需要分组(section),那么可以使用结构更简单的