UNPKG

rc-virtual-list

Version:
55 lines (53 loc) 2.04 kB
"use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default; Object.defineProperty(exports, "__esModule", { value: true }); exports.useGetSize = useGetSize; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var React = _interopRequireWildcard(require("react")); /** * Size info need loop query for the `heights` which will has the perf issue. * Let cache result for each render phase. */ function useGetSize(mergedData, getKey, heights, itemHeight) { var _React$useMemo = React.useMemo(function () { return [new Map(), []]; }, [mergedData, heights.id, itemHeight]), _React$useMemo2 = (0, _slicedToArray2.default)(_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; }