React-native之ListView高級屬性(16)

一. 簡介

ListView加載多數(shù)據(jù)時經(jīng)常會用到分頁,Gride排列射亏,滾動等高級操作近忙,下面就簡單介紹下

分頁

當(dāng)數(shù)據(jù)量很大的時候如何分頁加載 。這種情形分兩種情況考慮:
1.數(shù)據(jù)一次性拿到智润,邊滾動邊加載
2.數(shù)據(jù)不是一次性拿到及舍,而是有可能分屏取數(shù)據(jù)

對于第一種情況,在 ListView 內(nèi)部其實已經(jīng)做了分頁的處理:
ListView 內(nèi)部通過 curRenderedRowsCount 狀態(tài)保存已渲染的行數(shù)窟绷;
初始狀態(tài)下锯玛,要加載的數(shù)據(jù)條數(shù)等于 initialListSize (默認為 10 條);
在滾動時檢測當(dāng)前滾動的位置和最底部的距離兼蜈,如果小于 scrollRenderAheadDistance (默認為 1000)更振,就更新 curRenderedRowsCount ,在它原有值基礎(chǔ)上加 pageSize 個(默認為 1 條)饭尝;
由于屬性變化,觸發(fā)了 ListView 重新的 render 献宫。在渲染過程中钥平, curRenderedRowsCount 起到截斷數(shù)據(jù)的作用,React 的 diff 算法使得只有新加入的數(shù)據(jù)才會渲染到了界面上姊途。
整個過程類似于 Web 端懶加載機制涉瘾,即 每次在和底部的距離達到一個閾值時,加載接下來的 pageSize 個數(shù)據(jù) 捷兰。

對于第二種情況立叛,ListView 提供了相關(guān)的屬性:
onEndReachedThreshold ,在滾動即將到達底部時觸發(fā)贡茅;
onEndReached 秘蛇,在已經(jīng)到達底部時觸發(fā)其做;
我們可以在這兩個方法中調(diào)用接口去拿數(shù)據(jù),取到數(shù)據(jù)后再更新數(shù)據(jù)源赁还。

多列(Grid效果)

很多頁面中的列表并非單列的妖泄,乍一看似乎要做出不少調(diào)整,但實際上只通過布局即可達到相關(guān)效果艘策。ListView 并沒有強制要求一個 rowData 在展示時一定要占滿一行蹈胡,在多列的情況下,我們適時調(diào)整每個 rowData 占據(jù)的寬度即可朋蔫。

gride.png

由于 React Native 使用 Flexbox 進行布局罚渐,給ListView設(shè)置屬性contentContainerStyle;在實現(xiàn)多列時驯妄,主要用到的是 flexWrap:wrap 屬性:它的效果類似于 float荷并,即水平地排列每一項,當(dāng)放不下時進行折行處理富玷。在設(shè)置每行視圖占據(jù)一半寬度后就達到了兩列的效果璧坟,多列的類似。

滾動

ListView 只是整合了數(shù)據(jù)和展現(xiàn)赎懦,但實際滾動的功能還是由 ScrollView 全權(quán)負責(zé)雀鹃。ScrollView 實現(xiàn)完全和平臺相關(guān):在 iOS 上,它映射為 RCTScrollView 励两;在 Android 上黎茎,它映射為 RCTScrollView 和 AndroidHorizontalScrollView 。
React Native 讓不同端上的技術(shù)融合在了一起当悔,同時也給開發(fā)人員提出了更高的要求傅瞻。以 ScrollView 為例,大量的屬性其實原封不動映射給了 UIScrollView 盲憎,這就意味著如果想再深入地研究下去嗅骄,必須對客戶端相關(guān)技術(shù)有足夠了解。無論是前端還是客戶端饼疙,跳出自己熟悉的那片領(lǐng)域也許才是更進一步的關(guān)鍵溺森。
談到滾動,有一點不得不說的就是 列表的無限加載 窑眯,這牽涉到滾動的性能屏积。
Github 上的這個 issue 對此展開了熱烈的討論。其中有人就提到磅甩,數(shù)據(jù)量很大情況下炊林,ListView 在加載時所占用的 CPU 和內(nèi)存會大大增加,滾動到最后就導(dǎo)致了應(yīng)用 crash卷要。
為此渣聚,ListView 中新添加了一個實驗性的屬性: removeClippedSubviews 独榴,它能在滾動時及時刪掉列表中處于視窗的之外的行,以此達到降低內(nèi)存消耗的目的饵逐。不幸的是括眠,即使設(shè)置了這個屬性,程序雖然各項占用減少了不少倍权,但還是沒避免崩潰的命運掷豺。處于好奇,在最新版的 ListView 基礎(chǔ)上做了簡單嘗試薄声,不斷加載一個無限大的列表当船,但并沒有出現(xiàn)崩潰的情況:
即使加載了 3000、4000 行默辨,Android 真機德频、iOS 真機和 iOS 模擬器上都沒有崩潰;
Android 上明顯感到數(shù)據(jù)加載有 階段性的延時 缩幸,即滾動一定程度后壹置,再次滾動數(shù)據(jù)始終加載不出來或要等一段時間才加載出來,體驗較差表谊;iOS 相比要流暢的多钞护;
但不崩潰并非最終的目的,很多 React Native 使用者都在試圖改進 ListView 的性能表現(xiàn)爆办,相比于直接使用 Native 端的組件难咕,ListView 性能還是差強人意,有很大優(yōu)化空間距辆。
ListView 并沒有創(chuàng)造出新的東西余佃,它只是集各家所長,很好地將 React 的視圖渲染和 Native 端很成熟的滾動機制融合在了一起跨算,使用起來和其他組件無差爆土,靜態(tài)地定義View、動態(tài)地組織數(shù)據(jù)诸蚕,是給人帶來的直觀感受步势。

gride示例

class GrideDemo extends Component { constructor(props){ super(props); this.state={ dataSource:new ListView.DataSource({ rowHasChanged:(row1,row2)=> row1!== row2, }), }; } componentWillMount() { this.fetchData(); } render() { if (!this.state.loaded) { //如果movies==null的情況 初始情況 渲染加載視圖 return this.renderLoadingView(); } return ( <ListView dataSource={this.state.dataSource} renderRow={this.renderMovie} //對于listview只加上這句話,并修改布局就行 contentContainerStyle={styles.gride} style={styles.list} /> ); } renderLoadingView() { return ( <View style={styles.container}> <Text> 正在網(wǎng)絡(luò)上獲取電影數(shù)據(jù)…… </Text> </View> ); } //這是渲染一個電影信息 renderMovie(movie) { return ( <View style={styles.container}> <Image source={{uri: movie.posters.thumbnail}} style={styles.thumbnail} /> <Text style={styles.year}>{movie.year}</Text> </View> ); } fetchData() { fetch(REQUEST_URL) .then((response) => response.json()) .then((responseData) => { this.setState({ dataSource: this.state.dataSource.cloneWithRows(responseData.movies), loaded:true, }); }) .done(); //調(diào)用了done() —— 這樣可以拋出異常而不是簡單忽略 } const styles = StyleSheet.create({ list:{ paddingTop: 20, backgroundColor: '#F5FCFF', }, container: { width:100, height:100, margin:10, justifyContent: 'center', alignItems: 'center', backgroundColor: '#F5FCFF', }, thumbnail: { width: 81, height: 81, borderRadius:10, }, year: { textAlign: 'center', }, gride:{ flexWrap:'wrap', justifyContent:'flex-start', flexDirection:'row' } });

效果

gride_02.png

記錄自己的RN學(xué)習(xí)歷程挫望,只用于學(xué)習(xí)交流。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末狂窑,一起剝皮案震驚了整個濱河市媳板,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌泉哈,老刑警劉巖蛉幸,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件破讨,死亡現(xiàn)場離奇詭異,居然都是意外死亡奕纫,警方通過查閱死者的電腦和手機提陶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來匹层,“玉大人隙笆,你說我怎么就攤上這事∩ぃ” “怎么了撑柔?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長您访。 經(jīng)常有香客問我铅忿,道長,這世上最難降的妖魔是什么灵汪? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任檀训,我火速辦了婚禮,結(jié)果婚禮上享言,老公的妹妹穿的比我還像新娘峻凫。我一直安慰自己,他們只是感情好担锤,可當(dāng)我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布蔚晨。 她就那樣靜靜地躺著,像睡著了一般肛循。 火紅的嫁衣襯著肌膚如雪铭腕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天多糠,我揣著相機與錄音累舷,去河邊找鬼。 笑死夹孔,一個胖子當(dāng)著我的面吹牛被盈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播搭伤,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼只怎,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了怜俐?” 一聲冷哼從身側(cè)響起身堡,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拍鲤,沒想到半個月后贴谎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體汞扎,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年擅这,在試婚紗的時候發(fā)現(xiàn)自己被綠了澈魄。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡仲翎,死狀恐怖痹扇,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情谭确,我是刑警寧澤帘营,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站逐哈,受9級特大地震影響芬迄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜昂秃,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一禀梳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧肠骆,春花似錦算途、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至莉钙,卻和暖如春廓脆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背磁玉。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工停忿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蚊伞。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓席赂,卻偏偏與公主長得像,于是被迫代替她去往敵國和親时迫。 傳聞我的和親對象是個殘疾皇子颅停,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,933評論 2 355

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