@arco-design/web-vue
Version:
Arco Design Vue 2.0: A Vue.js 3 UI Library
124 lines (123 loc) • 3.36 kB
JavaScript
;
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
var vue = require("vue");
const useSize = ({
dataKeys,
contentRef,
fixedSize,
estimatedSize,
buffer
}) => {
const firstRangeAverageSize = vue.ref(0);
const sizeMap = /* @__PURE__ */ new Map();
const total = vue.computed(() => dataKeys.value.length);
const start = vue.ref(0);
const end = vue.computed(() => {
const _end = start.value + buffer.value * 3;
if (_end > total.value)
return total.value;
return _end;
});
const maxStart = vue.computed(() => {
const max = total.value - buffer.value * 3;
if (max < 0)
return 0;
return max;
});
const setStart = (index) => {
if (index < 0) {
start.value = 0;
} else if (index > maxStart.value) {
start.value = maxStart.value;
} else {
start.value = index;
}
};
const isFixed = vue.ref(fixedSize.value);
const _estimatedSize = vue.computed(() => {
if (estimatedSize.value !== 30) {
return estimatedSize.value;
}
return firstRangeAverageSize.value || estimatedSize.value;
});
const setItemSize = (key, size) => {
sizeMap.set(key, size);
};
const getItemSize = (index) => {
var _a;
if (isFixed.value) {
return _estimatedSize.value;
}
const _key = dataKeys.value[index];
return (_a = sizeMap.get(_key)) != null ? _a : _estimatedSize.value;
};
const hasItemSize = (key) => {
return sizeMap.has(key);
};
vue.onMounted(() => {
const firstRangeTotalSize = Array.from(sizeMap.values()).reduce(
(pre, value) => pre + value,
0
);
if (firstRangeTotalSize > 0) {
firstRangeAverageSize.value = firstRangeTotalSize / sizeMap.size;
}
});
const getScrollOffset = (index) => {
if (isFixed.value) {
return _estimatedSize.value * index;
}
return getOffset(0, index);
};
const getOffset = (start2, end2) => {
let offset = 0;
for (let i = start2; i < end2; i++) {
offset += getItemSize(i);
}
return offset;
};
const frontPadding = vue.computed(() => {
if (isFixed.value) {
return _estimatedSize.value * start.value;
}
return getOffset(0, start.value);
});
const getOffsetIndex = (scrollOffset) => {
const isForward = scrollOffset >= frontPadding.value;
let offset = Math.abs(scrollOffset - frontPadding.value);
const _start = isForward ? start.value : start.value - 1;
let offsetIndex = 0;
while (offset > 0) {
offset -= getItemSize(_start + offsetIndex);
isForward ? offsetIndex++ : offsetIndex--;
}
return offsetIndex;
};
const getStartByScroll = (scrollOffset) => {
const offsetIndex = getOffsetIndex(scrollOffset);
const _start = start.value + offsetIndex - buffer.value;
if (_start < 0)
return 0;
if (_start > maxStart.value)
return maxStart.value;
return _start;
};
const behindPadding = vue.computed(() => {
if (isFixed.value) {
return _estimatedSize.value * (total.value - end.value);
}
return getOffset(end.value, total.value);
});
return {
frontPadding,
behindPadding,
start,
end,
getStartByScroll,
setItemSize,
hasItemSize,
setStart,
getScrollOffset
};
};
exports.useSize = useSize;