UNPKG

@nutui/nutui-react

Version:

京东风格的轻量级移动端 React 组件库,支持一套代码生成 H5 和小程序

115 lines (114 loc) 4.56 kB
// 缓存列表初始化信息 var initPositinoCache = function(reaItemSize) { var length = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 0; var index = 0; var positions = Array(length); while(index < length){ positions[index] = { index: index, height: reaItemSize, width: reaItemSize, top: index * reaItemSize, bottom: (index + 1) * reaItemSize, left: index * reaItemSize, right: (index + 1) * reaItemSize }; index++; } return positions; }; // 获取列表总高度 var getListTotalSize = function(positions, horizontal) { var index = positions.length - 1; var size = 0; if (index < 0) { size = 0; } else { size = horizontal ? positions[index].right : positions[index].bottom; } return size; }; // 通过二分法找到 scrollOffset 对应的值 var binarySearch = function(positionsList, horizontal) { var value = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : 0; var start = 0; var end = positionsList.length - 1; var tempIndex = null; var key = horizontal ? 'right' : 'bottom'; while(start <= end){ var midIndex = Math.floor((start + end) / 2); var midValue = positionsList[midIndex][key]; // 相等则直接返回(因为是bottom, 因此startIndex应该是下一个节点) if (midValue === value) { return midIndex + 1; } // 中间值 < 传入值,则说明 value对应的节点 大于 start, start往后移动一位 if (midValue < value) { start = midIndex + 1; } else if (midValue > value) { // tempIndex存放最靠近值为value的所有 if (tempIndex === null || tempIndex > midIndex) { tempIndex = midIndex; } end = midIndex - 1; } } tempIndex = tempIndex || 0; return tempIndex; }; var getEndIndex = function(param) { var list = param.list, startIndex = param.startIndex, visibleCount = param.visibleCount, _param_itemEqual = param.itemEqual, itemEqual = _param_itemEqual === void 0 ? true : _param_itemEqual, positions = param.positions, offSetSize = param.offSetSize, overscan = param.overscan, _param_sizeKey = param.sizeKey, sizeKey = _param_sizeKey === void 0 ? 'width' : _param_sizeKey; var dataLength = list.length; var tempIndex = null; if (itemEqual) { var endIndex = startIndex + visibleCount; tempIndex = dataLength > 0 ? Math.min(dataLength, endIndex) : endIndex; } else { var sizeNum = 0; for(var i = startIndex; i < dataLength; i++){ sizeNum += positions[i][sizeKey] || 0; if (sizeNum > offSetSize) { var endIndex1 = i + overscan; tempIndex = dataLength > 0 ? Math.min(dataLength, endIndex1) : endIndex1; break; } } if (sizeNum < offSetSize) { tempIndex = dataLength; } } tempIndex = tempIndex || 0; return tempIndex; }; // 更新Item大小 var updateItemSize = function(positions, items, sizeKey, margin) { var newPos = positions.concat(); Array.from(items).forEach(function(item) { var index = Number(item.getAttribute('data-index')); var styleVal = item.getAttribute('style'); if (styleVal && styleVal.includes('none')) return; var nowSize = item.getBoundingClientRect()[sizeKey]; if (margin) nowSize += margin; var oldSize = positions[index][sizeKey]; // 存在差值, 更新该节点以后所有的节点 var dValue = oldSize - nowSize; if (dValue) { if (sizeKey === 'width') { newPos[index].right -= dValue; newPos[index][sizeKey] = nowSize; for(var k = index + 1; k < positions.length; k++){ newPos[k].left = positions[k - 1].right; newPos[k].right -= dValue; } } else if (sizeKey === 'height') { newPos[index].bottom -= dValue; newPos[index][sizeKey] = nowSize; for(var k1 = index + 1; k1 < positions.length; k1++){ newPos[k1].top = positions[k1 - 1].bottom; newPos[k1].bottom -= dValue; } } } }); }; export { initPositinoCache, getListTotalSize, binarySearch, getEndIndex, updateItemSize, };