React Native從入門到深入--組件ListView的使用

此文章中,包括簡單的布局,九宮格布局和頭視圖的使用小demo

前言

在iOS開發中,用的最多的一個控件就是TableView,ListView和TableView實現的效果一下,是React Native中的核心組件,高效的用于顯示一個可以垂直滾動變化的數據列表。

TableView的工作原理是:先加載UI,有數據源之后再刷新界面。

ListView的工作原理是:想創建一個ListView.DataSource數據源,然后給他傳遞一個普通的的數據組,在使用數據源來實例化一個ListView組件。使用renderRow回調函數,接受數組中的每個數組作為參數,返回一個可渲染的組件。

一、ListView常用屬性

ListView ?繼承ScrollerView相關的樣式屬性

DataSource? ?數據屬性

initialListSize ?number?

?控制組件剛掛載的時候渲染多少行數據,用來確保首屏顯示合適數量的數據,而不是花費太多幀逐步顯示出來。

onEndReachedThreshold ?number?

?設置什么時候偏移量達到設置的臨界值調用onEndReached

pageSize ?number ?

每幀渲染的行數

removeClippedSubviews? bool? ?

該屬性用于提供大數據列表的滾動性能。該使用的時候需要給每一行(row)的布局添加over:'hidden'樣式。該屬性默認是開啟狀態。

scrollRenderAheadDistance ?number?

當一行接近屏幕范圍多少像素之內的時候,開始渲染這一行。

IOS ? stickyHeaderIndices[number]

一個子視圖下標的數組,用于決定哪些成員會在滾動之后固定在屏幕頂端。?

function屬性

onChangeVisibleRows? (visibleRows,changedRows)=>void??

?當可見的行發生變化的時候回調該方法。?

onEndReached??

當所有的數據都已經渲染過,并且列表被滾動到距離最底部不足onEndReachedThreshold個像素的距離時調用原生的滾動事件會被作為參數傳遞。

注意:當第一次渲染時,如果數據不足一屏(比如初始值是空的),這個事件也會被觸發。

renderFooter? ()=>renderable??

在每次渲染過程中頭和尾總會重新進行渲染。如果發現該重新繪制的性能開銷比較大的時候,可以使用StaticContainer容器或者其他合適的組件。

renderHeader? 在每一次渲染過程中Footer(尾)該會一直在列表的底部,header(頭)該會一直在列表的頭部,用法同上。

renderRow ??(rowData,sectionID,rowID,highlightRow)=>renderable

該方法有四個參數,其中分別為數據源中一條數據,分組的ID,行的ID,以及標記是否是高亮選中的狀態信息。

renderScrollComponent ? (props)=>renderable??

該方法可以返回一個可以滾動的組件。默認該會返回一個ScrollView

renderSectionHeader??(sectionData,sectionID)=>renderable

如果設置了該方法,這樣會為每一個section渲染一個粘性的header視圖。該視圖粘性的效果是當剛剛被渲染開始的時候,該會處于對應的內容的頂部,然后開始滑動的時候,該會跑到屏幕的頂端。直到滑動到下一個section的header(頭)視圖,然后被替代為止。

renderSeparator ?(sectionID,rowID,adjacentRowHighlighted)=>renderable

如果設置該方法,會在被每一行的下面渲染一個組件作為分隔。除了每一個section分組的頭部視圖前面的最后一行。

方法

getMetrics()

導出一些用于性能分析的數據。

scrollTo

滾動到指定的X,Y偏移處,可以指定是否加上過渡動畫。

二、ListView高級特性

2.1給每段/組數據天天以后帶有粘性的頭部。

2.2在列表頭部和尾部增加單獨的內容,在到達列表尾部的時候調用函數(onEndReached),還有在視野可見的數據變化時調用回調函數(onChangeVisibleRows)。

2.3在性能方面優化

只更新變化的行 - 提供給數據源的rowHasChanged函數可以告訴ListView中它是否需要重繪一行數據(即:數據是否發生了變化)參見ListViewDataSource

限制頻率的行渲染-默認情況下,每次消息循環只有一行會被渲染(用可以pageSize屬性配置)這把較大的工作分散成小的碎片,以降低因為渲染而導致丟幀的可能性。

三、ListView常用Demo

3.1簡單的電商demo


3.1.1listView的使用步驟:


代碼截圖:


運行效果:


這種比較簡單,只要到時候改變返回的row中的View的樣式即可

3.2九宮格demo

使用ListView實現九宮格的原理就是,一個listView,將cell通過flex布局實現,主軸方向的改變,然后設置,每個cell的布局得到。

注意:在這個過程中,實現row主軸的改變后,實現多行顯示總是不行,原因是removeClippedSubviews={false}的默認狀態是ture是隱藏的。

3.2.1 代碼截圖:



運行截圖:



3.3分組帶有頭視圖的demo?

DataSource 的方法解析及技術分析

1.數組的提取和更新方法

clone方法會自動提取新數據并進行逐行對比(使用rowHasChanged方法中的策略),這樣ListView就知道哪些行需要重新渲染了。

?cloneWithRows(dataBlob(原始數據), rowIdentities(二維數組))

cloneWithRowsAndSections(dataBlob(原始數據), sectionIdentities(數組,包含了section標識符), rowIdentities(數組))

section標題和行數據提供自定義的提取方法和hasChanged比對方法。如果不提供,則會使用默認的defaultGetRowData和defaultGetSectionHeaderData方法來提取行數據和section標題。

默認的提取函數處理一下的數據類型

{ sectionID_1: { rowID_1: rowData1, ... }, ... } ? ? =>>> ? key:{}

{ sectionID_1: [ rowData1, rowData2, ... ], ... }? ? =>>> ? key:[]

[ [ rowData1, rowData2, ... ], ... ] ? ? ? ? ? ? ? ? ?= >>>> [[],[]....]

通過構造函數提取數組的方法一共有四種:

(1).getRowData(sectionIndex, rowIndex)? ? 返回渲染行數所需的數據(指定如何從原始dataBlob中提取數據)。

(2).getSectionHeaderData(dataBlob, sectionID); 獲取section標題數據。

(3)rowHasChanged(prevRowData, nextRowData); ?通過對比創建數組

(4). sectionHeaderHasChanged(prevSectionData, nextSectionData); ?通過對比創建

2.其他方法

getRowCount() ?獲取行數

getRowAndSectionCount() ? 獲取原始數據的分組個數

rowShouldUpdate(sectionIndex, rowIndex) ??返回值表明某行數據是否已變更,需要重新渲染。

getRowData(sectionIndex, rowIndex) ??返回渲染行所需的數據(指定如何從原始dataBlob中提取數據)。

getSectionIDForFlatIndex(index) ? ?給定索引值,求其對應sectionID。如果查找不到則返回null。

getSectionLengths() ??返回一個數組,包含每個section的行數量。

sectionHeaderShouldUpdate(sectionIndex) ??返回值用于說明section標題是否需要重新渲染。

看到上邊的大家可能還是蒙蒙的,簡單的說就說:

DataBlob就是原始數據就是一個大的字典{

sectionID1:{},或者[]

}

sectionIDs = ['sectionID1',sectionID2',sectionID3'.......] 每組的標題

rowIDS = [[row1,row2],[row1,row2],[row1,row2],[row1,row2].....] ?每組的數據

第一步需要在datasource中,設置ListView獲取row和section方法

第二步因為需要對數據進行循環拆分,組合成dataBlob需要的數據樣式屬于耗時操作,放到componentDidMount方法中,完成操作后刷新狀態,將數據傳到listView的render()方法中。


第三步,返回相關函數,設置屬性樣式布局

代碼截圖




運行結果:


完整demo請https://github.com/nanaLxs/ListView-demo下載。如果感覺可以請star。在這里謝謝啦!!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,460評論 6 538
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,067評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,467評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,468評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,184評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,582評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,616評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,794評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,343評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,096評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,291評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,863評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,513評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,941評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,190評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,026評論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,253評論 2 375

推薦閱讀更多精彩內容

  • 前言 學習本系列內容需要具備一定 HTML 開發基礎,沒有基礎的朋友可以先轉至 HTML快速入門(一) 學習 本人...
    珍此良辰閱讀 13,364評論 11 24
  • 一. 簡介 一個核心組件,用于高效地顯示一個可以垂直滾動的變化的數據列表。最基本的使用方式就是創建一個ListVi...
    飛奔的小馬閱讀 1,279評論 0 2
  • 作者:地球的火星人 “小灰!跟上來!”一個稚嫩的聲音道,說話的居然是維羅麗卡。 突如其來的一句話,引起了周天的懷疑...
    地球的火星人閱讀 268評論 0 0
  • 一個人的時候 是思緒放飛的時候 沏一杯清茶 看茶葉在杯中舒展旋環 任心念到九霄云外飛翔 去銀河上建一座石橋 給廣寒...
    二兩酒仙閱讀 303評論 5 16