ListView實現(xiàn)下拉動態(tài)渲染數(shù)據(jù)

在上一篇 ListView簡單實例 中我們講了 如何使用ListView 那么這一篇我們講講如何實現(xiàn)下拉動態(tài)渲染數(shù)據(jù)双肤。
首先我們講講數(shù)據(jù)是如何來規(guī)劃的 一般情況下我們有兩種規(guī)劃方案
前提比如我們數(shù)據(jù)是100條+

第一:一次性把100條數(shù)據(jù)fetch過來 然后由前端JS代碼來做分頁處理(如每次渲染10條)

第二:在server端做處理通過?page=n的方式 每次需要第幾頁數(shù)據(jù)就fetch第幾頁的數(shù)據(jù)

利弊
第一種方案的優(yōu)點是 一次性把數(shù)據(jù)全部載入完成 如果數(shù)據(jù)量很大的情況下可能會有很長的loading時間 但是對于服務(wù)端的壓力就會減少請求次數(shù)

第二種方案的優(yōu)點是 分批載入數(shù)據(jù) 數(shù)據(jù)量相對小 對于初始化的時候載入時間很快 缺點也很明顯 (如100條數(shù)據(jù) 每次顯示10 那么就需要訪問10此服務(wù)器 增加請求次數(shù))

其實這兩種都是不錯的方案 具體用什么方案來處理數(shù)據(jù) 根據(jù)自己的項目和需求來決定

本例子中 因為數(shù)據(jù)不是很多 我們就用第一種方案吧

我們拿上一篇的例子來做改動吧

constructor(props) {
    super(props);

    this.ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2});
    this.state = {
      dataSource:this.ds,
    }

    this.listData = null; //數(shù)據(jù)源
    this.len = null; //數(shù)據(jù)的個數(shù)
    this.count = null; //當(dāng)前數(shù)據(jù)總頁數(shù)
    this.pageSize = 10; //每次渲染的個數(shù)
    this.page = 0; //當(dāng)前頁數(shù)
}

變量全部定好以后 我們來載入數(shù)據(jù) 并給變量賦值如下:

componentDidMount() {
    fetch('http://ued.yihaodian.com:3001/api/70')
      .then((response) => response.json())
      .then((data) => {
        this.listData = data.listData;
        this.len = this.listData.length;
        this.count = Math.ceil(this.len / this.pageSize);

        this.setState({
          dataSource:this.ds.cloneWithRows(this.setData())
        })
      })
      .done();
}

this.setData() 返回要渲染的數(shù)據(jù) 這里要做一些處理

setData(){
    let num = this.page * this.pageSize; //獲取要渲染的個數(shù)
    if(num>this.len) num = this.len; //如果到最后一頁 num 大于 len 那么num等于len 防止空數(shù)據(jù)

    let data = [];
    for(let i=0;i<num;i++){
      data.push(this.listData[i]);
    }
    return data;
}

最關(guān)鍵的一步到了 我們之所以能動態(tài)渲染的核心 還是ListView組件提供的onEndReached方法 需要深入了解 可以到官方去看下詳細(xì)說明

//當(dāng)列表被滾動到距離最底部不足onEndReachedThreshold個像素的距離時調(diào)用
onEndReached = {this.onEnd.bind(this)}

看下onEnd的處理

onEnd(){
    //如果page<count 那么我們讓page++ 重新設(shè)置dataSource
    if(this.page < this.count){
      this.page++;
      if(this.setData().length > 0){ //防止重復(fù)渲染
        this.setState({
          dataSource:this.ds.cloneWithRows(this.setData())
        })
      }
    }else{
      console.log('已經(jīng)是最后一頁了');
      return false;
    }
}

最后就是渲染部分了

render() {
    return (
        <ListView
          style={{height:Dimensions.get('window').height-109}}
          dataSource={this.state.dataSource}
          renderRow={this.rendList} 
          onEndReached={this.onEnd.bind(this)}
          onEndReachedThreshold={0}
          enableEmptySections={true} />
    );
}

坑點

坑點1

官方也說過的 當(dāng)?shù)谝淮武秩緯r,如果數(shù)據(jù)不足一屏(比如初始值是空的)揍愁,這個事件也會被觸發(fā)

坑點2

onEndReachedThreshold的使用 如果不設(shè)置會導(dǎo)致一些莫名其妙的情況 上面的例子設(shè)置的是0 意思是正好拖到底部就觸發(fā)
如果是100那么就是距離底部100的位置觸發(fā)
還有個好玩的 如果是-100 那么就必須拉到底部 再往上拉100PX的距離再觸發(fā)事件(這里我們是不是想到 可以做一個很吊的功能啊 自己想啊..)

坑點3

enableEmptySections中文文檔里面居然沒有這個屬性 害的我去找官網(wǎng)找(E文不好啊)所以以后要多看看官方的

Warning: In next release empty section headers will be rendered. In this release you can use 'enableEmptySections' flag to render empty section headers.

如果你在用的時候報這個錯 那么就是這個屬性了 設(shè)置一下enableEmptySections = {true}

坑點4

ListView、ScrollView等類似組件最好是設(shè)置一個尺寸 來配合整體頁面的布局
效果:

aaa.gif
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市锐帜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌畜号,老刑警劉巖缴阎,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異简软,居然都是意外死亡蛮拔,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進(jìn)店門痹升,熙熙樓的掌柜王于貴愁眉苦臉地迎上來建炫,“玉大人,你說我怎么就攤上這事疼蛾「氐” “怎么了?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長衍慎。 經(jīng)常有香客問我转唉,道長,這世上最難降的妖魔是什么稳捆? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任赠法,我火速辦了婚禮,結(jié)果婚禮上乔夯,老公的妹妹穿的比我還像新娘期虾。我一直安慰自己,他們只是感情好驯嘱,可當(dāng)我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著喳坠,像睡著了一般鞠评。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上壕鹉,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天剃幌,我揣著相機(jī)與錄音,去河邊找鬼晾浴。 笑死负乡,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的脊凰。 我是一名探鬼主播抖棘,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼狸涌!你這毒婦竟也來了切省?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤帕胆,失蹤者是張志新(化名)和其女友劉穎朝捆,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體懒豹,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡芙盘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了脸秽。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片儒老。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖记餐,靈堂內(nèi)的尸體忽然破棺而出贷盲,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布巩剖,位于F島的核電站铝穷,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏佳魔。R本人自食惡果不足惜曙聂,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鞠鲜。 院中可真熱鬧宁脊,春花似錦、人聲如沸贤姆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽霞捡。三九已至坐漏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間碧信,已是汗流浹背赊琳。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留砰碴,地道東北人躏筏。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像呈枉,于是被迫代替她去往敵國和親趁尼。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容