在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,这个没什么说的
- loaded:用来控制整个页面的菊花
- error:如果Request错误,显示一个错误页面
- 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); }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]