@segment/react-tiny-virtual-list
Version:
A tiny but mighty list virtualization component, with zero dependencies 💪
93 lines (92 loc) • 3.21 kB
TypeScript
/// <reference types="react" />
import * as React from 'react';
import * as PropTypes from 'prop-types';
import SizeAndPositionManager, { ItemSize } from './SizeAndPositionManager';
import { ALIGNMENT, DIRECTION, SCROLL_CHANGE_REASON } from './constants';
export { DIRECTION as ScrollDirection } from './constants';
export declare type ItemPosition = 'absolute' | 'sticky';
export interface ItemStyle {
position: ItemPosition;
top?: number;
left: number;
width: string | number;
height?: number;
marginTop?: number;
marginLeft?: number;
marginRight?: number;
marginBottom?: number;
zIndex?: number;
}
export interface ItemInfo {
index: number;
style: ItemStyle;
}
export interface RenderedRows {
startIndex: number;
stopIndex: number;
}
export interface Props {
className?: string;
estimatedItemSize?: number;
height: number | string;
itemCount: number;
itemSize: ItemSize;
overscanCount?: number;
scrollOffset?: number;
scrollToIndex?: number;
scrollToAlignment?: ALIGNMENT;
scrollDirection?: DIRECTION;
stickyIndices?: number[];
style?: React.CSSProperties;
width?: number | string;
onItemsRendered?({startIndex, stopIndex}: RenderedRows): void;
onScroll?(offset: number, event: UIEvent): void;
renderItem(itemInfo: ItemInfo): React.ReactNode;
}
export interface State {
offset: number;
scrollChangeReason: SCROLL_CHANGE_REASON;
}
export default class VirtualList extends React.PureComponent<Props, State> {
static defaultProps: {
overscanCount: number;
scrollDirection: DIRECTION;
width: string;
};
static propTypes: {
estimatedItemSize: PropTypes.Requireable<any>;
height: PropTypes.Validator<any>;
itemCount: PropTypes.Validator<any>;
itemSize: PropTypes.Validator<any>;
onScroll: PropTypes.Requireable<any>;
onItemsRendered: PropTypes.Requireable<any>;
overscanCount: PropTypes.Requireable<any>;
renderItem: PropTypes.Validator<any>;
scrollOffset: PropTypes.Requireable<any>;
scrollToIndex: PropTypes.Requireable<any>;
scrollToAlignment: PropTypes.Requireable<any>;
scrollDirection: PropTypes.Requireable<any>;
stickyIndices: PropTypes.Requireable<any>;
style: PropTypes.Requireable<any>;
width: PropTypes.Requireable<any>;
};
itemSizeGetter: (itemSize: ItemSize) => (index: any) => any;
sizeAndPositionManager: SizeAndPositionManager;
readonly state: State;
private rootNode;
private styleCache;
componentDidMount(): void;
UNSAFE_componentWillReceiveProps(nextProps: Props): void;
componentDidUpdate(_: Props, prevState: State): void;
componentWillUnmount(): void;
scrollTo(value: number): void;
getOffsetForIndex(index: number, scrollToAlignment?: ALIGNMENT | undefined, itemCount?: number): number;
recomputeSizes(startIndex?: number): void;
render(): JSX.Element;
private getRef;
private handleScroll;
private getNodeOffset();
private getEstimatedItemSize(props?);
private getSize(index, itemSize);
private getStyle(index, sticky);
}