全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

React-Native实现ListView组件之上拉刷新实例(iOS和Android通用)

在web应用中,上拉刷新加载更多,下拉刷新列表的操作非常常见,那么在React-Native中是如何实现呢,我们具体来看一下
ReactNative提供了RefreshControl下拉刷新组件,但是没有提供上拉刷新组件,上拉刷新在App中是很常用的。

今天我们来实现一个iOS和Android通用的上拉刷新功能。

下面简要介绍下我实现的思路。

思路:

1、常量定义:

const moreText = "加载完毕"; //foot显示的文案 
//页码 
var pageNum = 1; 
//每页显示数据的条数 
const pageSize = 10; 
//页面总数据数 
var pageCount = 0; 
//页面List总数据 
var totalList = new Array(); 
 
//foot: 0 隐藏 1 已加载完成 2 显示加载中 

2、定义ListView

<ListView 
 enableEmptySections={true} 
 dataSource={this.state.dataSource} 
 renderRow={this._renderRow.bind(this)} 
 renderFooter={this._renderFooter.bind(this)} 
 onEndReached={this._endReached.bind(this)} 
 onEndReachedThreshold={0} 
/> 

3、声明State状态机变量

ListView.DataSource实例(列表依赖的数据源)

constructor(props) { 
 super(props); 
 this.state = { 
  dataSource: new ListView.DataSource({ 
   rowHasChanged: (r1, r2) => r1 !== r2, 
  }), 
  loaded: false,//控制Request请求是否加载完毕 
  foot:0,// 控制foot, 0:隐藏foot 1:已加载完成 2 :显示加载中 
  error:false, 

这里我们主要声明了dataSource,这个没什么说的

  1. loaded:用来控制整个页面的菊花
  2. error:如果Request错误,显示一个错误页面
  3. foot: 控制Footer的view

4、渲染页面前,加载数据

componentWillMount() { 
 this._fetchListData(); 
} 

5、Load服务端数据

_fetchListData() { 
 if(pageNum > 1){ 
  this.setState({loaded:true}); 
 } 
 fetch(requestURL, { 
  method: 'get', 
  headers: headerObj, 
 }).then(response =>{ 
  if (response.ok) { 
   return response.json(); 
  } else { 
   this.setState({error:true,loaded:true}); 
  } 
 }).then(json=>{ 
  let responseCode = json.code; 
  if (responseCode == 0) { 
   let responseData = json.data; 
 
   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方法的话,第二页会把第一页的数据覆盖掉。

6、定义renderRow方法

renderRow={this._renderRow.bind(this)}   列表组件渲染函数 ,此处页面逻辑省略。

7、定义renderFooter方法

renderFooter   页脚会在每次渲染过程中都重新渲染。

_renderFooter() { 
 if(this.state.foot === 1){//加载完毕 
  return ( 
  <View style={{height:40,alignItems:'center',justifyContent:'flex-start',}}> 
   <Text style={{color:'#999999',fontSize:12,marginTop:10}}> 
    {this.state.moreText} 
   </Text> 
  </View>); 
 }else if(this.state.foot === 2) {//加载中 
  return ( 
  <View style={{height:40,alignItems:'center',justifyContent:'center',}}> 
   <Image source={{uri:loadgif}} style={{width:20,height:20}}/> 
  </View>); 
 } 
} 

根据状态机变量foot控制Footer的显示

8、onEndReached 定义

onEndReachedThreshold={0}

当所有的数据都已经渲染过,并且列表被滚动到距离最底部不足onEndReachedThreshold个像素的距离时调用。原生的滚动事件会被作为参数传递。译注:当第一次渲染时,如果数据不足一屏(比如初始值是空的),这个事件也会被触发

_endReached(){ 
 if(this.state.foot != 0 ){ 
 return ; 
 } 
 this.setState({ 
 foot:2, 
 }); 
 this.timer = setTimeout( 
 () => { 
  pageNum ++; 
  this._fetchListData(); 
 },500); 
} 

这里需要注意一下几点

1、第一屏的时候可能也会触发_endReached方法,所以需要判断foot为非 0(即加载中和已加载完毕)时,直接return

2、上拉时,触发_endReached方法,可能server端接口响应很快,几乎看不到菊花效果,特地加了个500毫秒的等待

9、卸载Timer

componentWillUnmount() { 
// 如果存在this.timer,则使用clearTimeout清空。 
// 如果你使用多个timer,那么用多个变量,或者用个数组来保存引用,然后逐个clear 
 this.timer && clearTimeout(this.timer); 
} 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# ReactNative实现上拉刷新  # react  # 刷新组件  # 上拉刷新组件  # react-native android状态栏的实现  # React-native桥接Android原生开发详解  # React-Native之Android(6.0及以上)权限申请详解  # react-native 封装选择弹出框示例(试用ios&android)  # React-Native Android 与 IOS App使用一份代码实现方法  # Android React-Native通信数据模型分析  # android中使用react-native设置应用启动页过程详解  # 加载  # 也会  # 多个  # 加载中  # 就会  # 如果你  # 会在  # 每页  # 几点  # 会把  # 来实现  # 中都  # 第一页  # 需要注意  # 服务端  # 大家多多  # 清空  # 如何实现  # 条数  # 挺多 


相关文章: 专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?  C++如何使用std::optional?(处理可选值)  如何高效完成自助建站业务培训?  如何用免费手机建站系统零基础打造专业网站?  如何快速搭建二级域名独立网站?  如何快速上传自定义模板至建站之星?  专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?  建站之星展会模板:智能建站与自助搭建高效解决方案  javascript基本数据类型及类型检测常用方法小结  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  建站主机如何安装配置?新手必看操作指南  c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】  如何在景安云服务器上绑定域名并配置虚拟主机?  C++中引用和指针有什么区别?(代码说明)  红河网站制作公司,红河事业单位身份证如何上传?  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?  建站之星下载版如何获取与安装?  代刷网站制作软件,别人代刷火车票靠谱吗?  小型网站建站如何选择虚拟主机?  公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?  建站之星Pro快速搭建教程:模板选择与功能配置指南  如何通过主机屋免费建站教程十分钟搭建网站?  洛阳网站制作公司有哪些,洛阳的招聘网站都有哪些?  如何在阿里云香港服务器快速搭建网站?  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  如何快速配置高效服务器建站软件?  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  如何通过FTP服务器快速搭建网站?  广州商城建站系统开发成本与周期如何控制?  如何通过虚拟主机快速完成网站搭建?  英语简历制作免费网站推荐,如何将简历翻译成英文?  建站之星免费版是否永久可用?  建站主机选虚拟主机还是云服务器更好?  如何通过远程VPS快速搭建个人网站?  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  如何在Golang中使用replace替换模块_指定本地或远程路径  深圳企业网站制作设计,在深圳如何网上全流程注册公司?  c++如何打印函数堆栈信息_c++ backtrace函数与符号名解析【方法】  杭州银行网站设计制作流程,杭州银行怎么开通认证方式?  义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?  浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?  手机网站制作与建设方案,手机网站如何建设?  简单实现Android文件上传  建站之星导航如何优化提升用户体验?  如何快速登录WAP自助建站平台?  如何在云主机快速搭建网站站点?  企业网站制作费用多少,企业网站空间一般需要多大,费用是多少?  做企业网站制作流程,企业网站制作基本流程有哪些? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。