Skip to content

VirtualList

Deprecated: Use ListView instead. VirtualList is now a thin wrapper that maps old prop names to ListView.

React-level virtualization for long lists. Only renders items within the visible viewport plus overscan.

Import

tsx
import { VirtualList } from "silvery"

Props

PropTypeDefaultDescription
itemsT[]requiredArray of items to render
heightnumberrequiredHeight of the list viewport in rows
renderItem(item: T, index: number, meta?: ItemMeta) => ReactNoderequiredRender function for each item
itemHeightnumber | ((item: T, index: number) => number)1Height of each item in rows
scrollTonumber--Index to keep visible. Ignored when interactive=true
overscannumber5Extra items to render above/below viewport
maxRenderednumber100Maximum items to render at once
overflowIndicatorboolean--Show overflow indicators
keyExtractor(item: T, index: number) => string | numberindexKey extractor
widthnumber--Width of the list
gapnumber0Gap between items in rows
renderSeparator() => ReactNode--Render separator between items
virtualized(item: T, index: number) => boolean--Predicate for items already virtualized
interactiveboolean--Enable built-in keyboard and mouse wheel
selectedIndexnumber--Currently selected index (controlled)
onSelectionChange(index: number) => void--Called when selection changes
onSelect(index: number) => void--Called when Enter is pressed
onEndReached() => void--Called when visible range nears end
onEndReachedThresholdnumber5Items from end to trigger onEndReached
listFooterReactNode--Content rendered after all items

ItemMeta

ts
interface ItemMeta {
  isSelected: boolean
}

Ref: VirtualListHandle

ts
interface VirtualListHandle {
  scrollToItem(index: number): void
}

Prop Mapping to ListView

VirtualListListView
interactivenavigable
selectedIndexcursorIndex
onSelectionChangeonCursorIndexChange
keyExtractorgetKey
itemHeightestimateHeight
isSelected (ItemMeta)isCursor (ListItemMeta)

See Also

Released under the MIT License.