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阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • 前言 学习本系列内容需要具备一定 HTML 开发基础,没有基础的朋友可以先转至 HTML快速入门(一) 学习 本人...
    珍此良辰阅读 13,317评论 11 24
  • 一. 简介 一个核心组件,用于高效地显示一个可以垂直滚动的变化的数据列表。最基本的使用方式就是创建一个ListVi...
    飞奔的小马阅读 1,231评论 0 2
  • 作者:地球的火星人 “小灰!跟上来!”一个稚嫩的声音道,说话的居然是维罗丽卡。 突如其来的一句话,引起了周天的怀疑...
    地球的火星人阅读 256评论 0 0
  • 一个人的时候 是思绪放飞的时候 沏一杯清茶 看茶叶在杯中舒展旋环 任心念到九霄云外飞翔 去银河上建一座石桥 给广寒...
    二两酒仙阅读 288评论 5 16