在web应用中,上拉刷新加载更多,下拉刷新列表的操作非常常见,那么在React-Native中是如何实现呢,我们具体来看一下 ReactNative提供了RefreshControl下拉刷新组件,但是没有提供上拉刷新组件,上拉刷新在App中是很常用的。
今天我们来实现一个iOS和Android通用的上拉刷新功能。
下面简要介绍下我实现的思路。
思路:
1、常量定义:
//foot: 0 隐藏 1 已加载完成 2 显示加载中
在web应用中,上拉刷新加载更多,下拉刷新列表的操作非常常见,那么在React-Native中是如何实现呢,我们具体来看一下 ReactNative提供了RefreshControl下拉刷新组件,但是没有提供上拉刷新组件,上拉刷新在App中是很常用的。
今天我们来实现一个iOS和Android通用的上拉刷新功能。
下面简要介绍下我实现的思路。
思路:
//foot: 0 隐藏 1 已加载完成 2 显示加载中
ListView.DataSource实例(列表依赖的数据源)
这里我们主要声明了dataSource,这个没什么说的
pageCount = responseData.count;
let list = responseData.data;
if (orderList == null) {
orderList = [];
currentCount = 0;
} else {
currentCount = list.length;
}
if(currentCount < pageSize){
//当当前返回的数据小于PageSize时,认为已加载完毕
this.setState({ foot:1,moreText:moreText});
}else{//设置foot 隐藏Footer
this.setState({foot:0});
}
for (var i=0; i < list.length; i++) {
totalList.push( list[i] );
}
this.setState({
dataSource: this.state.dataSource.cloneWithRows(totalList),loaded: true,});
}else{
this.setState({error:true,loaded:true});
}
}).catch(function (error) {
this.setState({error:true,loaded:true});
});
}
这里的细节挺多的:
1、当pageNum > 1时,就不要整个页面的菊花,此时loaded一直为true,这个主要是为了页面效果,要不然没加载一页数据,这个屏幕就会闪一下。
2、比较当前返回的list的大小,是否小于pageSize,控制Footer是否隐藏,还是显示已加载完毕
3、声明了一个全局的totalList对象,每次有新数据的时候,都push进去。
如果不采用push的方式的话,直接采用setState方法的话,第二页会把第一页的数据覆盖掉。
renderRow={this._renderRow.bind(this)} 列表组件渲染函数 ,此处页面逻辑省略。
renderFooter 页脚会在每次渲染过程中都重新渲染。
根据状态机变量foot控制Footer的显示
onEndReachedThreshold={0}
当所有的数据都已经渲染过,并且列表被滚动到距离最底部不足onEndReachedThreshold个像素的距离时调用。原生的滚动事件会被作为参数传递。译注:当第一次渲染时,如果数据不足一屏(比如初始值是空的),这个事件也会被触发
这里需要注意一下几点
1、第一屏的时候可能也会触发_endReached方法,所以需要判断foot为非 0(即加载中和已加载完毕)时,直接return
2、上拉时,触发_endReached方法,可能server端接口响应很快,几乎看不到菊花效果,特地加了个500毫秒的等待