跳到主要内容

FlatList

一个用于渲染基本平面列表的高性能接口,支持最便捷的功能

  • 完全跨平台。
  • 可选的水平模式。
  • 可配置的可见性回调。
  • 支持页眉。
  • 支持页脚。
  • 支持分隔符。
  • 下拉刷新。
  • 滚动加载。
  • 支持 ScrollToIndex。
  • 支持多列。

如果需要章节支持,请使用 <SectionList>

示例

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

下面是一个更复杂、可选择的示例。

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

这是 <VirtualizedList> 的便捷包装器,因此继承了其属性(以及 <ScrollView> 的属性),这些属性并未在此明确列出,并附带以下注意事项:

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

参考

属性

VirtualizedList 属性

继承 VirtualizedList 属性


必需
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 函数,该函数允许您设置任何您想要更改前导或尾随分隔符渲染的属性,以防更常见的 highlightunhighlight(它们设置 highlighted: boolean 属性)不足以满足您的用例。

类型
函数
  • 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 使用。

类型
类数组

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 内部视图的样式。


ListHeaderComponent

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

类型
组件,元素

ListHeaderComponentStyle

ListHeaderComponent 内部视图的样式。


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

有关流类型和更多文档,请参阅 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。有关流类型和更多文档,请参阅 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