virtua
Version:
A zero-config, fast and small (~3kB) virtual list (and grid) component for React, Vue, Solid and Svelte.
96 lines (95 loc) • 3.95 kB
TypeScript
import { JSX, ReactElement, ReactNode, Ref } from "react";
import { CacheSnapshot, ScrollToIndexOpts } from "../core/index.js";
import { CustomContainerComponent, CustomItemComponent } from "./types.js";
/**
* Methods of {@link WindowVirtualizer}.
*/
export interface WindowVirtualizerHandle {
/**
* Get current {@link CacheSnapshot}.
*/
readonly cache: CacheSnapshot;
/**
* Find the start index of visible range of items.
*/
findStartIndex: () => number;
/**
* Find the end index of visible range of items.
*/
findEndIndex: () => number;
/**
* Scroll to the item specified by index.
* @param index index of item
* @param opts options
*/
scrollToIndex(index: number, opts?: ScrollToIndexOpts): void;
}
/**
* Props of {@link WindowVirtualizer}.
*/
export interface WindowVirtualizerProps<T = unknown> {
/**
* Elements rendered by this component.
*
* You can also pass a function and set {@link WindowVirtualizerProps.data} to create elements lazily.
*/
children: ReactNode | ((data: T, index: number) => ReactElement);
/**
* The data items rendered by this component. If you set a function to {@link WindowVirtualizerProps.children}, you have to set this prop.
*/
data?: ArrayLike<T>;
/**
* Extra item space in pixels to render before/after the viewport. The minimum value is 0. Lower value will give better performance but you can increase to avoid showing blank items in fast scrolling.
* @defaultValue 200
*/
bufferSize?: number;
/**
* Item size hint for unmeasured items in pixels. It will help to reduce scroll jump when items are measured if used properly.
*
* - If not set, initial item sizes will be automatically estimated from measured sizes. This is recommended for most cases.
* - If set, you can opt out estimation and use the value as initial item size.
*/
itemSize?: number;
/**
* While true is set, scroll position will be maintained from the end not usual start when items are added to/removed from start. It's recommended to set false if you add to/remove from mid/end of the list because it can cause unexpected behavior. This prop is useful for reverse infinite scrolling.
*/
shift?: boolean;
/**
* If true, rendered as a horizontally scrollable list. Otherwise rendered as a vertically scrollable list.
*/
horizontal?: boolean;
/**
* You can restore cache by passing a {@link CacheSnapshot} on mount. This is useful when you want to restore scroll position after navigation. The snapshot can be obtained from {@link WindowVirtualizerHandle.cache}.
*
* **The length of items should be the same as when you take the snapshot, otherwise restoration may not work as expected.**
*/
cache?: CacheSnapshot;
/**
* A prop for SSR. If set, the specified amount of items will be mounted in the initial rendering regardless of the container size until hydrated. The minimum value is 0.
*/
ssrCount?: number;
/**
* Component or element type for container element.
* @defaultValue "div"
*/
as?: keyof JSX.IntrinsicElements | CustomContainerComponent;
/**
* Component or element type for item element. This component will get {@link CustomItemComponentProps} as props.
* @defaultValue "div"
*/
item?: keyof JSX.IntrinsicElements | CustomItemComponent;
/**
* Callback invoked whenever scroll offset changes.
*/
onScroll?: () => void;
/**
* Callback invoked when scrolling stops.
*/
onScrollEnd?: () => void;
}
/**
* {@link Virtualizer} controlled by the window scrolling. See {@link WindowVirtualizerProps} and {@link WindowVirtualizerHandle}.
*/
export declare const WindowVirtualizer: <T>(props: WindowVirtualizerProps<T> & {
ref?: Ref<WindowVirtualizerHandle>;
}) => ReactElement;