跳到主要内容

FlatList

一个高性能的列表接口,用于渲染基础的、扁平的列表,支持最常用的功能。

  • 完全跨平台。
  • 可选的水平模式。
  • 可配置的可见性回调。
  • 支持头部。
  • 支持尾部。
  • 支持分隔符。
  • 下拉刷新。
  • 滚动加载。
  • 支持滚动到索引。
  • 多列支持。

如果您需要分组支持,请使用 <SectionList>

示例

要渲染多列,请使用 numColumns 属性。使用此方法而不是 flexWrap 布局可以避免与项目高度逻辑冲突。

下方提供一个更复杂的、可选择的示例。

  • 通过将 extraData={selectedId} 传递给 FlatList,我们确保 FlatList 本身在状态更改时会重新渲染。如果不设置此属性,FlatList 将不知道它需要重新渲染任何项目,因为它是一个 PureComponent,属性比较不会显示任何更改。
  • keyExtractor 告诉列表使用 id 作为 React 键,而不是默认的 key 属性。

这是 <VirtualizedList> 的一个便捷包装器,因此继承了这里未明确列出的 <ScrollView> 的 props,以及以下注意事项:

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

参考

属性

VirtualizedList Props

继承 VirtualizedList Props


必需
renderItem

tsx
renderItem({
item: ItemT,
index: number,
separators: {
highlight: () => void;
unhighlight: () => void;
updateProps: (select: 'leading' | 'trailing', newProps: any) => void;
}
}): JSX.Element;

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

提供额外的元数据,如 index(如果您需要),以及一个更通用的 separators.updateProps 函数,该函数允许您设置您希望更改前置分隔符或后置分隔符渲染的任何 props,以防更常见的 highlightunhighlight(它们设置 highlighted: boolean prop)对于您的用例来说不够。

类型
函数
  • item (Object): 从 data 中渲染的当前项目。
  • index (number): 当前项目在 data 数组中的索引。
  • separators (Object)
    • highlight (Function)
    • unhighlight (Function)
    • updateProps (Function)
      • select (enum('leading', 'trailing'))
      • newProps (Object)

用法示例

tsx
<FlatList
ItemSeparatorComponent={
Platform.OS !== 'android' &&
(({highlighted}) => (
<View
style={[style.separator, highlighted && {marginLeft: 0}]}
/>
))
}
data={[{title: 'Title Text', key: 'item1'}]}
renderItem={({item, index, separators}) => (
<TouchableHighlight
key={item.key}
onPress={() => this._onPress(item)}
onShowUnderlay={separators.highlight}
onHideUnderlay={separators.unhighlight}>
<View style={{backgroundColor: 'white'}}>
<Text>{item.title}</Text>
</View>
</TouchableHighlight>
)}
/>

必需
data

要渲染的项目数组(或类数组列表)。可以通过直接针对 VirtualizedList 来使用其他数据类型。

类型
ArrayLike

ItemSeparatorComponent

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

类型
组件,函数,元素

ListEmptyComponent

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

类型
组件,元素

ListFooterComponent

渲染在所有项目之后。可以是 React 组件(例如 SomeComponent)或 React 元素(例如 <SomeComponent />)。

类型
组件,元素

ListFooterComponentStyle

ListFooterComponent 的内部 View 的样式。


ListHeaderComponent

渲染在所有项目之前。可以是 React 组件(例如 SomeComponent)或 React 元素(例如 <SomeComponent />)。

类型
组件,元素

ListHeaderComponentStyle

ListHeaderComponent 的内部 View 的样式。


columnWrapperStyle

numColumns > 1 时,为多项目行提供的可选自定义样式。


extraData

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

类型
任何

getItemLayout

tsx
(data, index) => {length: number, offset: number, index: number}

getItemLayout 是一种可选的优化,如果您提前知道项目的大小(高度或宽度),可以跳过动态内容的测量。如果您的项目大小固定,getItemLayout 会非常高效,例如:

tsx
  getItemLayout={(data, index) => (
{length: ITEM_HEIGHT, offset: ITEM_HEIGHT * index, index}
)}

对于包含数百个项目的列表,添加 getItemLayout 可以显著提高性能。如果您指定了 ItemSeparatorComponent,请记住在偏移计算中包含分隔符的长度(高度或宽度)。

类型
函数

horizontal

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

类型
布尔值

initialNumToRender

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

类型默认
数字10

initialScrollIndex

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

类型
数字

inverted

反转滚动方向。使用 -1 的比例变换。

类型
布尔值

keyExtractor

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

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

类型
函数

numColumns

多列只能在 horizontal={false} 时渲染,并且会像 flexWrap 布局一样呈现锯齿状。项目的高度应全部相同 - 不支持瀑布流布局。

类型
数字

onRefresh

tsx
() => void;

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

类型
函数

onViewableItemsChanged

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

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

progressViewOffset

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

类型
数字

refreshing

当等待新数据刷新时,将其设置为 true。

类型
布尔值

removeClippedSubviews

警告

在某些情况下使用此属性可能会导致错误(内容缺失)——请自行承担风险。

当为 true 时,屏幕外的子视图将从其原生支持的父视图中移除。这可能会提高大型列表的滚动性能。在 Android 上,默认值为 true

类型
布尔值

viewabilityConfig

有关 flow 类型和进一步文档,请参阅 ViewabilityHelper.js

类型
ViewabilityConfig

viewabilityConfig 接受一个 ViewabilityConfig 类型,这是一个包含以下属性的对象:

属性类型
minimumViewTime数字
viewAreaCoveragePercentThreshold数字
itemVisiblePercentThreshold数字
waitForInteraction布尔值

需要 viewAreaCoveragePercentThresholditemVisiblePercentThreshold 中的至少一个。这需要在 constructor 中完成,以避免以下错误(参考)。

  Error: Changing viewabilityConfig on the fly is not supported
tsx
constructor (props) {
super(props)

this.viewabilityConfig = {
waitForInteraction: true,
viewAreaCoveragePercentThreshold: 95
}
}
tsx
<FlatList
viewabilityConfig={this.viewabilityConfig}
...

minimumViewTime

项目必须实际可见的最短时间(以毫秒为单位),然后才会触发可见性回调。较高的值意味着滚动内容而不停止不会将内容标记为可见。

viewAreaCoveragePercentThreshold

视口必须覆盖的百分比,才能将部分被遮挡的项目视为“可见”,范围为 0-100。完全可见的项目始终被视为可见。值为 0 意味着视口中的单个像素即可使项目可见,值为 100 意味着项目必须完全可见或覆盖整个视口才能被视为可见。

itemVisiblePercentThreshold

类似于 viewAreaCoveragePercentThreshold,但考虑的是项目可见部分的百分比,而不是它所覆盖的可视区域的比例。

waitForInteraction

在用户滚动或渲染后调用 recordInteraction 之前,没有任何东西被视为可见。


viewabilityConfigCallbackPairs

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

类型
ViewabilityConfigCallbackPair 的数组

方法

flashScrollIndicators()

tsx
flashScrollIndicators();

短暂显示滚动指示器。


getNativeScrollRef()

tsx
getNativeScrollRef(): React.ElementRef<typeof ScrollViewComponent>;

提供对底层滚动组件的引用。


getScrollResponder()

tsx
getScrollResponder(): ScrollResponderMixin;

提供对底层滚动响应程序的句柄。


getScrollableNode()

tsx
getScrollableNode(): any;

提供对底层滚动节点的句柄。

scrollToEnd()

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

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

参数

姓名类型
参数对象

有效的 `params` 键是

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

scrollToIndex()

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

滚动到指定索引处的项目,使其位于可视区域中,其中 viewPosition 0 将其置于顶部,1 置于底部,0.5 置于中心。

注意

不指定 getItemLayout 属性,无法滚动到渲染窗口之外的位置。

参数

姓名类型
参数
必需
对象

有效的 `params` 键是

  • 'animated' (boolean) - 滚动时列表是否应执行动画。默认为 true
  • 'index' (number) - 要滚动到的索引。必需。
  • 'viewOffset' (number) - 最终目标位置的固定像素偏移量。
  • 'viewPosition' (number) - 值为 0 将索引指定的项目置于顶部,1 置于底部,0.5 置于中心。

scrollToItem()

tsx
scrollToItem(params: {
animated?: ?boolean,
item: Item,
viewPosition?: number,
});

需要线性扫描数据 - 如果可能,请改用 scrollToIndex

注意

不指定 getItemLayout 属性,无法滚动到渲染窗口之外的位置。

参数

姓名类型
参数
必需
对象

有效的 `params` 键是

  • 'animated' (boolean) - 滚动时列表是否应执行动画。默认为 true
  • 'item' (object) - 要滚动到的项目。必需。
  • 'viewPosition' (number)

scrollToOffset()

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

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

参数

姓名类型
参数
必需
对象

有效的 `params` 键是

  • 'offset' (number) - 要滚动到的偏移量。如果 horizontal 为 true,则偏移量是 x 值,在任何其他情况下,偏移量是 y 值。必需。
  • 'animated' (boolean) - 滚动时列表是否应执行动画。默认为 true