您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關React-Native如何實現ListView組件之上拉刷新功能的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
思路:
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); }
感謝各位的閱讀!關于“React-Native如何實現ListView組件之上拉刷新功能”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。