Virtuoso API Reference

All properties are optional - by default, the component will render empty. Under the hood, both Virtuoso and GroupedVirtuoso are the same component - the only difference is that they have different TypeScript interfaces applied. All Virtuoso props work for GroupedVirtuoso, but the properties in the GroupedVirtuoso section work only in grouped mode.

If you are using TypeScript and want to use correctly typed component ref, you can use the VirtuosoHandle and the GroupedVirtuosoHandle types.

import { Virtuoso, VirtuosoHandle } from 'react-virtuoso'
const ref = useRef<VirtuosoHandle>(null)
<Virtuoso ref={ref} /*...*/ />

Virtuoso Properties


Type parameters



  • {}




Optional alignToBottom: boolean

Defined in src/components.tsx:220

Setting alignToBottom to true aligns the items to the bottom of the list if the list is shorter than the viewport. Use followOutput property to keep the list aligned when new items are appended.


Optional atBottomStateChange: (atBottom: boolean) => void

Defined in src/components.tsx:199

Called with true / false when the list has reached the bottom / gets scrolled up. Can be used to load newer items, like tail -f.


Optional atBottomThreshold: number

Defined in src/components.tsx:249

The property accepts pixel values.

By default 4. Redefine to change how much away from the bottom the scroller can be before the list is not considered not at bottom.


Optional atTopStateChange: (atTop: boolean) => void

Defined in src/components.tsx:204

Called with true / false when the list has reached the top / gets scrolled down.


Optional atTopThreshold: number

Defined in src/components.tsx:242

The property accepts pixel values.

By default 0. Redefine to change how much away from the top the scroller can be before the list is not considered not at top.


Optional components: Components<C>

Defined in src/components.tsx:98

Use the components property for advanced customization of the elements rendered by the list.


Optional computeItemKey: ComputeItemKey<D, C>

Defined in src/components.tsx:108

If specified, the component will use the function to generate the key property for each list item.


Optional context: C

Defined in src/components.tsx:45

Additional context available in the custom components and content callbacks


Optional customScrollParent: HTMLElement

Defined in src/components.tsx:230

Pass a reference to a scrollable parent element, so that the list won't wrap in its own.


Optional data: readonly D[]

Defined in src/components.tsx:40

The data items to be rendered. If data is set, the total count will be inferred from the length of the array.


Optional defaultItemHeight: number

Defined in src/components.tsx:119

By default, the component assumes the default item height from the first rendered item (rendering it as a "probe").

If the first item turns out to be an outlier (very short or tall), the rest of the rendering will be slower, as multiple passes of rendering should happen for the list to fill the viewport.

Setting defaultItemHeight causes the component to skip the "probe" rendering and use the property value as default height instead.


Optional endReached: (index: number) => void

Defined in src/components.tsx:183

Gets called when the user scrolls to the end of the list. Receives the last item index as an argument. Can be used to implement endless scrolling.


Optional firstItemIndex: number

Defined in src/components.tsx:172

Use when implementing inverse infinite scrolling - decrease the value this property in combination with data or totalCount to prepend items to the top of the list.

Warning: the firstItemIndex should be a positive number, based on the total amount of items to be displayed.


Optional fixedItemHeight: number

Defined in src/components.tsx:132

Can be used to improve performance if the rendered items are of known size. Setting it causes the component to skip item measurements.


Optional followOutput: FollowOutput

Defined in src/components.tsx:159

If set to true, the list automatically scrolls to bottom if the total count is changed. Set to "smooth" for an animated scrolling.

By default, followOutput scrolls down only if the list is already at the bottom. To implement an arbitrary logic behind that, pass a function:

 followOutput={(isAtBottom: boolean) => {
   if (expression) {
     return 'smooth' // can be 'auto' or false to avoid scrolling
   } else {
     return false
 }} />


Optional headerFooterTag: string

Defined in src/components.tsx:164

Set to customize the wrapper tag for the header and footer components (default is div).


Optional increaseViewportBy: number | { bottom: number ; top: number }

Defined in src/components.tsx:67

The property accepts pixel values.

Set the increaseViewportBy property to artificially increase the viewport size, causing items to be rendered before outside of the viewport. The property causes the component to render more items than the necessary, but can help with slow loading content. Using { top?: number, bottom?: number } lets you set the increase for each end separately.


Optional initialItemCount: number

Defined in src/components.tsx:93

Use for server-side rendering - if set, the list will render the specified amount of items regardless of the container / item size.


Optional initialScrollTop: number

Defined in src/components.tsx:87

Set this value to offset the initial location of the list. Warning: using this property will still run a render cycle at the scrollTop: 0 list window. If possible, avoid using it and stick to initialTopMostItemIndex instead.


Optional initialTopMostItemIndex: number | IndexLocationWithAlign

Defined in src/components.tsx:80

Set to a value between 0 and totalCount - 1 to make the list start scrolled to that item. Pass in an object to achieve additional effects similar to scrollToIndex.


Optional isScrolling: (isScrolling: boolean) => void

Defined in src/components.tsx:177

Called when the list starts/stops scrolling.


Optional itemContent: ItemContent<D, C>

Defined in src/components.tsx:103

Set the callback to specify the contents of the item.


Optional itemSize: SizeFunction

Defined in src/components.tsx:126

Allows customizing the height/width calculation of Item elements.

The default implementation reads el.getBoundingClientRect().height and el.getBoundingClientRect().width.


Optional itemsRendered: (items: ListItem<D>[]) => void

Defined in src/components.tsx:214

Called with the new set of items each time the list items are rendered due to scrolling.


Optional overscan: number | { main: number ; reverse: number }

Defined in src/components.tsx:56

The property accepts pixel values.

Set the overscan property to make the component "chunk" the rendering of new items on scroll. The property causes the component to render more items than the necessary, but reduces the re-renders on scroll. Setting { main: number, reverse: number } lets you extend the list in both the main and the reverse scrollable directions. See the increaseViewportBy property for a similar behavior (equivalent to the overscan in react-window).


Optional rangeChanged: (range: ListRange) => void

Defined in src/components.tsx:193

Called with the new set of items each time the list items are rendered due to scrolling.


Optional react18ConcurrentRendering: boolean

Defined in src/components.tsx:254

No longer necessary after 2.10.2. component should work out of the box.


Optional scrollSeekConfiguration: ScrollSeekConfiguration | false

Defined in src/components.tsx:139

Use to display placeholders if the user scrolls fast through the list.

Set components.ScrollSeekPlaceholder to change the placeholder content.


Optional scrollerRef: (ref: HTMLElement | Window | null) => any

Defined in src/components.tsx:235

Provides access to the root DOM element


Optional startReached: (index: number) => void

Defined in src/components.tsx:188

Called when the user scrolls to the start of the list.


Optional topItemCount: number

Defined in src/components.tsx:74

Set the amount of items to remain fixed at the top of the list.

For a header that scrolls away when scrolling, check the components.Header property.


Optional totalCount: number

Defined in src/components.tsx:35

The total amount of items to be rendered.


Optional totalListHeightChanged: (height: number) => void

Defined in src/components.tsx:209

Called when the total list height is changed due to new items or viewport resize.


Optional useWindowScroll: boolean

Defined in src/components.tsx:225

Uses the document scroller rather than wrapping the list in its own.

GroupedVirtuoso Properties


Type parameters



  • {}




Optional groupContent: GroupContent

Defined in src/components.tsx:267

Specifies how each each group header gets rendered. The callback receives the zero-based index of the group.


Optional groupCounts: number[]

Defined in src/components.tsx:262

Specifies the amount of items in each group (and, actually, how many groups are there). For example, passing [20, 30] will display 2 groups with 20 and 30 items each.


Optional itemContent: GroupItemContent<D, C>

Defined in src/components.tsx:272

Specifies how each each item gets rendered.




  • VirtuosoHandle



autoscrollToBottom(): void

Defined in src/components.tsx:605

Use this with combination with follow output if you have images loading in the list. Listen to the image loading and call the method.

Returns: void


scrollBy(location: ScrollToOptions): void

Defined in src/components.tsx:601

Scrolls the component with the specified amount. See ScrollToOptions (MDN)



Returns: void


scrollIntoView(location: FlatScrollIntoViewLocation): void

Defined in src/components.tsx:593

Scrolls the item into view if necessary. See the website example for an implementation.



Returns: void


scrollTo(location: ScrollToOptions): void

Defined in src/components.tsx:597

Scrolls the component to the specified location. See ScrollToOptions (MDN)



Returns: void


scrollToIndex(location: number | FlatIndexLocationWithAlign): void

Defined in src/components.tsx:589

Scrolls the component to the specified item index. See IndexLocationWithAlign for more options.


locationnumber | FlatIndexLocationWithAlign

Returns: void