跳到主要内容

VirtualizedList

更方便的 <FlatList><SectionList> 组件的基础实现,这些组件也有更好的文档记录。一般来说,只有当您需要的灵活性超过 FlatList 所提供的灵活性时,才应该真正使用它,例如用于处理不可变数据而不是普通数组。

通过维护活动项目的有限渲染窗口,并将渲染窗口之外的所有项目替换为适当大小的空白区域,虚拟化大大提高了大型列表的内存消耗和性能。窗口会适应滚动行为,如果项目远离可见区域,则以低优先级(在任何正在运行的交互之后)增量渲染项目;否则,以高优先级渲染项目,以最大限度地减少看到空白区域的可能性。

示例


一些注意事项

  • 当内容滚动出渲染窗口时,内部状态不会被保留。请确保您的所有数据都捕获在项目数据或 Flux、Redux 或 Relay 等外部存储中。
  • 这是一个 PureComponent,这意味着如果 props 是浅相等的,它将不会重新渲染。请确保您的 renderItem 函数所依赖的一切都作为 prop(例如 extraData)传递,该 prop 在更新后不是 ===,否则您的 UI 可能不会在更改时更新。这包括 data prop 和父组件状态。
  • 为了限制内存并实现平滑滚动,内容在屏幕外异步渲染。这意味着可能会出现滚动速度快于填充率,并瞬间看到空白内容的情况。这是一种权衡,可以根据每个应用程序的需求进行调整,我们正在幕后努力改进它。
  • 默认情况下,列表会在每个项目上查找 key prop,并将其用作 React 键。或者,您可以提供自定义的 keyExtractor prop。

参考

Props

ScrollView Props

继承自 ScrollView Props


data

传递给 getItemgetItemCount 以检索项目的不透明数据类型。

类型
any

必需
getItem

tsx
(data: any, index: number) => any;

用于从任何类型的数据 blob 中提取项目的通用访问器。

类型
function

必需
getItemCount

tsx
(data: any) => number;

确定数据 blob 中有多少个项目。

类型
function

必需
renderItem

tsx
(info: any) => ?React.Element<any>

data 中获取一个项目并将其渲染到列表中

类型
function

CellRendererComponent

CellRendererComponent 允许自定义当 renderItem/ListItemComponent 渲染的单元格放置到基础 ScrollView 中时如何包装。此组件必须接受事件处理程序,这些处理程序通知 VirtualizedList 单元格内的更改。

类型
React.ComponentType<CellRendererProps>

ItemSeparatorComponent

在每个项目之间渲染,但不在顶部或底部。默认情况下,提供 highlightedleadingItem props。renderItem 提供 separators.highlight/unhighlight,这将更新 highlighted prop,但您也可以使用 separators.updateProps 添加自定义 props。可以是 React 组件 (例如 SomeComponent),也可以是 React 元素 (例如 <SomeComponent />)。

类型
组件, 函数, 元素

ListEmptyComponent

当列表为空时渲染。可以是 React 组件 (例如 SomeComponent),也可以是 React 元素 (例如 <SomeComponent />)。

类型
组件, 元素

ListItemComponent

每个数据项都使用此元素渲染。可以是 React 组件类,也可以是渲染函数。

类型
组件, 函数

ListFooterComponent

在所有项目的底部渲染。可以是 React 组件 (例如 SomeComponent),也可以是 React 元素 (例如 <SomeComponent />)。

类型
组件, 元素

ListFooterComponentStyle

ListFooterComponent 的内部 View 的样式。

类型必需
ViewStyleProp

ListHeaderComponent

在所有项目的顶部渲染。可以是 React 组件 (例如 SomeComponent),也可以是 React 元素 (例如 <SomeComponent />)。

类型
组件, 元素

ListHeaderComponentStyle

ListHeaderComponent 的内部 View 的样式。

类型
View Style

debug

debug 将启用额外的日志记录和可视化覆盖,以帮助调试用法和实现,但会严重影响性能。

类型
boolean

disableVirtualization

已弃用。 虚拟化提供了显著的性能和内存优化,但会完全卸载渲染窗口之外的 React 实例。您应该仅在出于调试目的时禁用此功能。

类型
boolean

extraData

一个标记属性,用于告诉列表重新渲染(因为它实现了 PureComponent)。如果您的任何 renderItem、Header、Footer 等函数依赖于 data prop 之外的任何内容,请将其放在此处并将其视为不可变的。

类型
any

getItemLayout

tsx
(
data: any,
index: number,
) => {length: number, offset: number, index: number}
类型
function

horizontal

如果为 true,则水平渲染项目,而不是垂直堆叠。

类型
boolean

initialNumToRender

初始批次中要渲染的项目数。这应该足以填充屏幕,但不要太多。请注意,为了提高滚动到顶部操作的感知性能,这些项目永远不会作为窗口渲染的一部分卸载。

类型默认
number10

initialScrollIndex

不是从顶部第一个项目开始,而是从 initialScrollIndex 开始。这禁用了“滚动到顶部”优化,该优化使前 initialNumToRender 个项目始终渲染,并立即渲染从此初始索引开始的项目。需要实现 getItemLayout

类型
number

inverted

反转滚动方向。使用 -1 的缩放变换。

类型
boolean

keyExtractor

tsx
(item: any, index: number) => string;

用于在指定索引处为给定项目提取唯一键。键用于缓存,并用作 React 键来跟踪项目重新排序。默认提取器检查 item.key,然后检查 item.id,然后像 React 一样回退到使用索引。

类型
function

maxToRenderPerBatch

每个增量渲染批次中要渲染的最大项目数。一次渲染的项目越多,填充率越好,但响应性可能会受到影响,因为渲染内容可能会干扰对按钮点击或其他交互的响应。

类型
number

onEndReached

当滚动位置到达列表逻辑末尾的 onEndReachedThreshold 范围内时调用一次。

类型
(info: {distanceFromEnd: number}) => void

onEndReachedThreshold

列表的后缘必须距离内容末尾多远(以列表的可见长度为单位)才能触发 onEndReached 回调。因此,当内容末尾在列表可见长度的一半以内时,值 0.5 将触发 onEndReached

类型默认
number2

onRefresh

tsx
() => void;

如果提供,将添加标准的 RefreshControl 以实现“下拉刷新”功能。请确保也正确设置 refreshing prop。

类型
function

onScrollToIndexFailed

tsx
(info: {
index: number,
highestMeasuredFrameIndex: number,
averageItemLength: number,
}) => void;

用于处理滚动到尚未测量的索引时发生的故障。建议的操作是计算您自己的偏移量并 scrollTo 它,或者尽可能远地滚动,然后在渲染更多项目后重试。

类型
function

onStartReached

当滚动位置到达列表逻辑起点的 onStartReachedThreshold 范围内时调用一次。

类型
(info: {distanceFromStart: number}) => void

onStartReachedThreshold

列表的前缘必须距离内容起点多远(以列表的可见长度为单位)才能触发 onStartReached 回调。因此,当内容起点在列表可见长度的一半以内时,值 0.5 将触发 onStartReached

类型默认
number2

onViewableItemsChanged

当行的可见性发生变化时调用,由 viewabilityConfig prop 定义。

类型
(callback: {changed: ViewToken[], viewableItems: ViewToken[]}) => void

persistentScrollbar

类型
bool

progressViewOffset

当加载指示器需要偏移才能正确显示时,设置此项。

类型
number

refreshControl

自定义刷新控件元素。设置后,它将覆盖内部构建的默认 <RefreshControl> 组件。onRefresh 和 refreshing props 也将被忽略。仅适用于垂直 VirtualizedList。

类型
element

refreshing

在等待从刷新中获取新数据时,将其设置为 true。

类型
boolean

removeClippedSubviews

这可能会提高大型列表的滚动性能。

注意:在某些情况下可能存在错误(内容丢失) - 使用风险自负。

类型
boolean

renderScrollComponent

tsx
(props: object) => element;

渲染自定义滚动组件,例如,使用样式不同的 RefreshControl

类型
function

viewabilityConfig

有关 flow 类型和更多文档,请参阅 ViewabilityHelper.js

类型
ViewabilityConfig

viewabilityConfigCallbackPairs

ViewabilityConfig/onViewableItemsChanged 对的列表。当满足其对应的 ViewabilityConfig 的条件时,将调用特定的 onViewableItemsChanged。有关 flow 类型和更多文档,请参阅 ViewabilityHelper.js

类型
ViewabilityConfigCallbackPair 数组

updateCellsBatchingPeriod

低优先级项目渲染批次之间的时间量,例如,用于渲染远离屏幕的项目。与 maxToRenderPerBatch 类似的填充率/响应性权衡。

类型
number

windowSize

确定在可见区域之外渲染的最大项目数,以可见长度为单位。因此,如果您的列表填充屏幕,则 windowSize={21}(默认值)将渲染可见屏幕区域,以及视口上方和下方最多 10 个屏幕。减少此数字将减少内存消耗并可能提高性能,但会增加快速滚动可能显示未渲染内容的瞬时空白区域的可能性。

类型
number

方法

flashScrollIndicators()

tsx
flashScrollIndicators();

getScrollableNode()

tsx
getScrollableNode(): any;

getScrollRef()

tsx
getScrollRef():
| React.ElementRef<typeof ScrollView>
| React.ElementRef<typeof View>
| null;

getScrollResponder()

tsx
getScrollResponder () => ScrollResponderMixin | null;

提供对底层滚动响应器的句柄。请注意,this._scrollRef 可能不是 ScrollView,因此我们需要检查它是否响应 getScrollResponder,然后再调用它。


scrollToEnd()

tsx
scrollToEnd(params?: {animated?: boolean});

滚动到内容末尾。如果没有 getItemLayout prop,可能会出现卡顿。

参数

名称类型
paramsobject

有效的 params 键是

  • 'animated' (boolean) - 列表在滚动时是否应执行动画。默认为 true

scrollToIndex()

tsx
scrollToIndex(params: {
index: number;
animated?: boolean;
viewOffset?: number;
viewPosition?: number;
});

有效的 params 包括

  • 'index' (number)。必需。
  • 'animated' (boolean)。可选。
  • 'viewOffset' (number)。可选。
  • 'viewPosition' (number)。可选。

scrollToItem()

tsx
scrollToItem(params: {
item: ItemT;
animated?: boolean;
viewOffset?: number;
viewPosition?: number;
);

有效的 params 包括

  • 'item' (Item)。必需。
  • 'animated' (boolean)。可选。
  • 'viewOffset' (number)。可选。
  • 'viewPosition' (number)。可选。

scrollToOffset()

tsx
scrollToOffset(params: {
offset: number;
animated?: boolean;
});

滚动到列表中特定的内容像素偏移量。

参数 offset 期望滚动的偏移量。如果 horizontal 为 true,则偏移量为 x 值,在任何其他情况下,偏移量为 y 值。

参数 animated (默认 true) 定义列表在滚动时是否应执行动画。