react-virtualized
Version:
React components for efficiently rendering large, scrollable lists and tabular data
72 lines (61 loc) • 2.58 kB
JavaScript
/**
* Default implementation of cellRangeRenderer used by Grid.
* This renderer supports cell-caching while the user is scrolling.
*/
export default function defaultCellRangeRenderer(_ref) {
var cellCache = _ref.cellCache;
var cellRenderer = _ref.cellRenderer;
var columnSizeAndPositionManager = _ref.columnSizeAndPositionManager;
var columnStartIndex = _ref.columnStartIndex;
var columnStopIndex = _ref.columnStopIndex;
var horizontalOffsetAdjustment = _ref.horizontalOffsetAdjustment;
var isScrolling = _ref.isScrolling;
var rowSizeAndPositionManager = _ref.rowSizeAndPositionManager;
var rowStartIndex = _ref.rowStartIndex;
var rowStopIndex = _ref.rowStopIndex;
var scrollLeft = _ref.scrollLeft;
var scrollTop = _ref.scrollTop;
var verticalOffsetAdjustment = _ref.verticalOffsetAdjustment;
var renderedCells = [];
for (var rowIndex = rowStartIndex; rowIndex <= rowStopIndex; rowIndex++) {
var rowDatum = rowSizeAndPositionManager.getSizeAndPositionOfCell(rowIndex);
for (var columnIndex = columnStartIndex; columnIndex <= columnStopIndex; columnIndex++) {
var columnDatum = columnSizeAndPositionManager.getSizeAndPositionOfCell(columnIndex);
var key = rowIndex + '-' + columnIndex;
var style = {
height: rowDatum.size,
left: columnDatum.offset + horizontalOffsetAdjustment,
position: 'absolute',
top: rowDatum.offset + verticalOffsetAdjustment,
width: columnDatum.size
};
var cellRendererParams = {
columnIndex: columnIndex,
isScrolling: isScrolling,
key: key,
rowIndex: rowIndex,
style: style
};
var renderedCell = void 0;
// Avoid re-creating cells while scrolling.
// This can lead to the same cell being created many times and can cause performance issues for "heavy" cells.
// If a scroll is in progress- cache and reuse cells.
// This cache will be thrown away once scrolling complets.
if (isScrolling) {
if (!cellCache[key]) {
cellCache[key] = cellRenderer(cellRendererParams);
}
renderedCell = cellCache[key];
// If the user is no longer scrolling, don't cache cells.
// This makes dynamic cell content difficult for users and would also lead to a heavier memory footprint.
} else {
renderedCell = cellRenderer(cellRendererParams);
}
if (renderedCell == null || renderedCell === false) {
continue;
}
renderedCells.push(renderedCell);
}
}
return renderedCells;
}