A set of hooks, components and utilities for scrolling large datasets. Standalone components could be used as well as lower level hooks to achieve maximum flexibility.
Features
- Rendering only visible subset of data;
- Automatic scroll container resize;
- Lightweight;
- Fast
import { ListScroller } from '@vadim-sartakov/react-scroller';
const TOTAL_ROWS = 1000;
const listValue = [...new Array(TOTAL_ROWS).keys()];
const element = (
  <ListScroller
    defaultRowHeight={40}
    totalRows={TOTAL_ROWS}
    value={listValue}
    height="100vh"
    overscroll={2}
    render={({ value, style }) => (
      <div style={style}>
        {value}
      </div>
    )}
  />
);
| Prop | Type | Optional | Description | 
| value | any[] |  | Array of values | 
| totalRows | number |  | Total number of rows | 
| defaultRowHeight | number |  | Default height of scroller cell | 
| rowsSizes | number[] | Yes | Array of scroller cell heights | 
| height | number, string |  | Scroller container height. Could be any valid css string | 
| overscroll | number | Yes | Number of elements which should be rendered out of visible scroller container | 
| RowComponent | React component | Yes | Custom row component for grid rows. Default is div. | 
| rowComponentProps | Object | Yes | Props to pass to row component | 
import { GridScroller } from '@vadim-sartakov/react-scroller';
const TOTAL_ROWS = 1000;
const TOTAL_COLUMNS = 50;
// gridValue is a simple array of arrays
const gridValue = [...new Array(TOTAL_ROWS).keys()]
  .map(row => [...new Array(TOTAL_COLUMNS).keys()]);
const element = (
  <GridScroller
    defaultRowHeight={40}
    defaultColumnWidth={150}
    totalRows={TOTAL_ROWS}
    totalColumns={TOTAL_COLUMNS}
    value={gridValue}
    width="100%"
    height="100vh"
    overscroll={2}
    render={({ value, style }) => (
      <div style={style}>
        {value}
      </div>
    )}
  />
);
| Prop | Type | Optional | Description | 
| value | any[][] |  | Array of values | 
| totalRows | number |  | Total number of rows | 
| totalColumns | number | Yes | Total number of columns | 
| defaultRowHeight | number |  | Default height of scroller cell | 
| defaultColumnWidth | number | Yes | Default width of scroller cell | 
| rowsSizes | number[] | Yes | Array of scroller cell heights | 
| columnsSizes | number[] | Yes | Array of scroller cell widths | 
| width | number, string | Yes | Scroller container width. Could be any valid css string | 
| height | number, string |  | Scroller container height. Could be any valid css string | 
| onScroll | Callback | Yes | On scroll callback | 
| overscroll | number | Yes | Number of elements which should be rendered out of visible scroller container | 
| RowComponent | React component | Yes | Custom row component for grid rows. Default is div. | 
| rowComponentProps | Object | Yes | Props to pass to row component | 
| CellComponent | React component |  | Cell component which will be rendered as scroller cell | 
| cellComponentProps | Object | Yes | Props to pass to cell component |