Skip to main content

VirtualizedList

A high-performance list component that efficiently renders only the items currently visible on the screen, regardless of the size of the data set.

github
View source code

Usage

The VirtualizedList component is a high-performance list component that efficiently renders only the items currently visible on the screen, regardless of the size of the data set.

This is the base implementation of the FlatList and SectionList components. In general, this should only be used if you need more flexibility than FlatList or SectionList can provides, e.g. for use with immutable data instead of plain arrays.

Virtualization massively improves the performance and memory consumption of large lists by maintaining a finite render window showing only active items and replacing all items outside of the render window with appropriately sized blank space. The render window adapts with scrolling behavior, items are rendered incrementally with low-pri (after any running interactions) if they are far from the visible area, or with hi-pri if they are near the visible area.

Best Practices

Considerations

  • Internal State: Internal state is not preserved when content scrolls out of the render window. Ensure all your data is captured in the item data or external stores like Flux, Redux, or Relay.
  • Prop Updates: This is a PureComponent meaning it will not re-render if props remain shallow-equal. Make sure that everything your renderItem function depends on is in passed as a prop (e.g. extraData) that is not === after updates, otherwise your UI may not update on changes. This includes the data prop and parent component state.
  • Item Rendering: To constrain memory and enable smooth scrolling, content is rendered asynchronously offscreen. This means it's possible to scroll faster than the fill rate and momentarily see blank content. This is a tradeoff that can be adjusted to suit the needs of each application.
  • Key Management: By default, the list looks for a key prop on each item and uses that for the React key. Alternatively, you can provide a custom keyExtractor prop.

Accessibility Considerations

  • Focus Retention: Retain focus and scroll position when adding or removing items from the list.
  • Content Labeling: Ensure each list item has accessible labels or descriptions for screen readers.

Performance Considerations

  • Windowing: Adjust the initialNumToRender and windowSize props to strike a balance between performance and UX.
  • Cell Recycling: Use CellRendererComponent to efficiently recycle rendered items, especially for very large datasets.
  • Avoid Expensive Re-renders: Avoid triggering unnecessary re-renders by memoizing components or using React.PureComponent.

VirtualizedList Classes

Class NameDescription
abyss-virtualized-list-rootVirtualizedList root element

VirtualizedList Props

Extends React Native - VirtualizedList props.

NameTypeDefaultRequiredDescription
contentContainerStyle
Abyss.Style<'View'> | undefined
--
These styles will be applied to the scroll view content container which
wraps all of the child views.
contentInset
Insets | undefined
--
The amount by which the scroll view content is inset from the edges of the scroll view.
Defaults to {top: 0, left: 0, bottom: 0, right: 0}.
contentOffset
PointProp | undefined
--
Used to manually set the starting scroll offset.
The default value is { x: 0, y: 0 }
endFillColor
Abyss.Color | undefined
--
Sometimes a ScrollView takes up more space than its content fills. When this is the case,
this prop will fill the rest of the ScrollView with a color to avoid setting a background
and creating unnecessary overdraw. This is an advanced optimization that is not needed in
the general case.
fadingEdgeLength
Abyss.Space | undefined
--
Fades out the edges of the scroll content.

If the value is greater than 0, the fading edges will be set accordingly
to the current scroll direction and position,
indicating if there is more content to show.

The default value is 0.
hitSlop
number | Insets | null | undefined
--
This defines how far a touch event can start away from the view.
Typical interface guidelines recommend touch targets that are at least
30 - 40 points/density-independent pixels. If a Touchable view has
a height of 20 the touchable height can be extended to 40 with
hitSlop={{ top: 10, bottom: 10, left: 0, right: 0 }}
NOTE The touch area never extends past the parent view bounds and
the Z-index of sibling views always takes precedence if a touch
hits two overlapping views.
ListFooterComponentStyle
Abyss.Style<'View'> | undefined
--
Styling for internal View for ListFooterComponent
ListHeaderComponentStyle
Abyss.Style<'View'> | undefined
--
Styling for internal View for ListHeaderComponent
style
Abyss.Style<'VirtualizedList'> | undefined
--
VirtualizedList style properties with Abyss token mapping
Table of Contents