rc-virtual-list
Version:
React Virtual List Component
48 lines (46 loc) • 1.68 kB
JavaScript
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
import * as React from 'react';
/**
* Size info need loop query for the `heights` which will has the perf issue.
* Let cache result for each render phase.
*/
export function useGetSize(mergedData, getKey, heights, itemHeight) {
var _React$useMemo = React.useMemo(function () {
return [new Map(), []];
}, [mergedData, heights.id, itemHeight]),
_React$useMemo2 = _slicedToArray(_React$useMemo, 2),
key2Index = _React$useMemo2[0],
bottomList = _React$useMemo2[1];
var getSize = function getSize(startKey) {
var endKey = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : startKey;
// Get from cache first
var startIndex = key2Index.get(startKey);
var endIndex = key2Index.get(endKey);
// Loop to fill the cache
if (startIndex === undefined || endIndex === undefined) {
var dataLen = mergedData.length;
for (var i = bottomList.length; i < dataLen; i += 1) {
var _heights$get;
var item = mergedData[i];
var key = getKey(item);
key2Index.set(key, i);
var cacheHeight = (_heights$get = heights.get(key)) !== null && _heights$get !== void 0 ? _heights$get : itemHeight;
bottomList[i] = (bottomList[i - 1] || 0) + cacheHeight;
if (key === startKey) {
startIndex = i;
}
if (key === endKey) {
endIndex = i;
}
if (startIndex !== undefined && endIndex !== undefined) {
break;
}
}
}
return {
top: bottomList[startIndex - 1] || 0,
bottom: bottomList[endIndex]
};
};
return getSize;
}