VirtualizedList
FlatList
和SectionList
的底层实现。FlatList 和 SectionList 使用起来更方便,同时也有相对更详细的文档。一般来说,仅当想获得比 FlatList 更高的灵活性(比如说在使用 immutable data 而不是 普通数组)的时候,你才应该考虑使用 VirtualizedList。
Vritualization 通过维护一个有限的渲染窗口(其中包含可见的元素),并将渲染窗口之外的元素全部用合适的定长空白空间代替的方式,极大的改善了内存消耗以及在有大量数据情况下的使用性能。这个渲染窗口能响应滚动行为。当一个元素离可视区太远时,它就有一个较低优先级;否则就获得一个较高的优先级。渲染窗口通过这种方式逐步渲染其中的元素(在进行了任何交互之后),以尽量减少出现空白区域的可能性。
示例
注意事项:
- 当某行滑出渲染区域之外后,其内部状态将不会保留。请确保你在行组件以外的地方保留了数据。
- 本组件继承自 PureComponent 而非通常的 Component,这意味着如果其 props 在浅比较中是相等的,则不会重新渲染。所以请先检查你的 renderItem 函数所依赖的 props 数据(包括 data 属性以及可能用到的父组件的 state),如果是一个引用类型(Object 或者数组都是引用类型),则需要先修改其引用地址(比如先复制到一个新的 Object 或者数组中),然后再修改其值,否则界面很可能不会刷新。(译注:这一段不了解的朋友建议先学习下 js 中的基本类型和引用类型。)
- 为了优化内存占用同时保持滑动的流畅,列表内容会在屏幕外异步绘制。这意味着如果用户滑动的速度超过渲染的速度,则会先看到空白的内容。这是为了优化不得不作出的妥协,而我们也在设法持续改进。
- 默认情况下每行都需要提供一个不重复的 key 属性。你也可以提供一个 keyExtractor 函数来生成 key。
文档
Props
Required renderItem
(info: any) => ?React.Element<any>
根据行数据 data 渲染每一行的组件
类型 | 必需 |
---|---|
function | 是 |
data
默认的getItem
函数假设它是一个数组(Array<{key: string}>
),但是你能重写getItem
, getItemCount
和 keyExtractor
来处理任何类型的可索引数据。
类型 | 必需 |
---|---|
any | 是 |
getItem
(data: any, index: number) => object;
通用的获取器,用来从任意类型的数据块中获取一个元素。
类型 | 必需 |
---|---|
function | 是 |
getItemCount
(data: any) => number;
用来决定数据块中一共有多少元素。
类型 | 必需 |
---|---|
function | 是 |
debug
开启额外的日志和视觉覆盖功能,来协助对使用和实现的调试。但是会严重地影响性能。
类型 | 必需 |
---|---|
boolean | 否 |
extraData
这是一个标记属性,用来告诉列表重新渲染(由于它实现了 PureComponent)。如果有 data 属性之外的数据引用,就把它列在这里,并把它当成不可变的。
类型 | 必需 |
---|---|
any | 否 |
getItemLayout
(
data: any,
index: number,
) => {length: number, offset: number, index: number}
getItemLayout 是一个可选的优化,用于避免动态测量内容尺寸的开销,不过前提是你可以提前知道内容的高度。如果你的行高是固定的,getItemLayout 用起来就既高效又简单。
类型 | 必需 |
---|---|
function | 否 |
initialScrollIndex
设置初始化渲染开始的索引,这样会禁用掉直接滚动到顶部操作优化,第一批渲染的元素从 initialScrollIndex 开始,保证初始化渲染的性能。这个方法要求 getItemLayout 必须实现。
类型 | 必需 |
---|---|
number | 否 |
inverted
反转滑动方向。(等价于)使用缩放转化的值为-1。
类型 | 必需 |
---|---|
boolean | 否 |
CellRendererComponent
每个子项渲染使用的元素。可以是一个 react 组件类,或者一个渲染函数。默认使用View
类型 | 必需 |
---|---|
component, function | 否 |
ItemSeparatorComponent
Rendered in between each item, but not at the top or bottom. By default, highlighted
and leadingItem
props are provided. renderItem
provides separators.highlight
/unhighlight
which will update the highlighted
prop, but you can also add custom props with separators.updateProps
.
类型 | Required |
---|---|
component, function | No |
listKey
A unique identifier for this list. If there are multiple VirtualizedLists at the same level of nesting within another VirtualizedList, this key is necessary for virtualization to work properly.
类型 | Required |
---|---|
string | True |
ListEmptyComponent
当列表为空时渲染。可以是一个 React 类,或者一个渲染函数,或者一个已渲染的元素。
类型 | 必需 |
---|---|
component, function, element | 否 |
ListItemComponent
Each data item is rendered using this element. Can be a React Component Class, or a render function
类型 | Required |
---|---|
component, function | No |
ListFooterComponent
在所有子项最下面渲染的组件(列表底部)。可以是一个 React 类,或者一个渲染函数,或者一个已渲染的元素。
类型 | 必需 |
---|---|
component, function, element | 否 |
ListFooterComponentStyle
Styling for internal View for ListFooterComponent
类型 | Required |
---|---|
ViewStyleProp | No |
ListHeaderComponent
在所有子项最上面渲染的组件(列表头部).可以是一个 React 类,或者一个渲染函数,或者一个已渲染的元素。
类型 | 必需 |
---|---|
component, function, element | 否 |