routie dev init since i didn't adhere to any proper guidance up until now
This commit is contained in:
+111
@@ -0,0 +1,111 @@
|
||||
import { createVNode as _createVNode, Fragment as _Fragment, createElementVNode as _createElementVNode, normalizeClass as _normalizeClass, normalizeStyle as _normalizeStyle } from "vue";
|
||||
// Styles
|
||||
import "./VVirtualScroll.css";
|
||||
|
||||
// Components
|
||||
import { VVirtualScrollItem } from "./VVirtualScrollItem.js"; // Composables
|
||||
import { makeComponentProps } from "../../composables/component.js";
|
||||
import { makeDimensionProps, useDimension } from "../../composables/dimensions.js";
|
||||
import { useToggleScope } from "../../composables/toggleScope.js";
|
||||
import { makeVirtualProps, useVirtual } from "../../composables/virtual.js"; // Utilities
|
||||
import { onMounted, onScopeDispose, toRef } from 'vue';
|
||||
import { convertToUnit, genericComponent, getCurrentInstance, getScrollParent, IN_BROWSER, propsFactory, useRender } from "../../util/index.js"; // Types
|
||||
export const makeVVirtualScrollProps = propsFactory({
|
||||
items: {
|
||||
type: Array,
|
||||
default: () => []
|
||||
},
|
||||
renderless: Boolean,
|
||||
...makeVirtualProps(),
|
||||
...makeComponentProps(),
|
||||
...makeDimensionProps()
|
||||
}, 'VVirtualScroll');
|
||||
export const VVirtualScroll = genericComponent()({
|
||||
name: 'VVirtualScroll',
|
||||
props: makeVVirtualScrollProps(),
|
||||
setup(props, {
|
||||
slots
|
||||
}) {
|
||||
const vm = getCurrentInstance('VVirtualScroll');
|
||||
const {
|
||||
dimensionStyles
|
||||
} = useDimension(props);
|
||||
const {
|
||||
calculateVisibleItems,
|
||||
containerRef,
|
||||
markerRef,
|
||||
handleScroll,
|
||||
handleScrollend,
|
||||
handleItemResize,
|
||||
scrollToIndex,
|
||||
paddingTop,
|
||||
paddingBottom,
|
||||
computedItems
|
||||
} = useVirtual(props, toRef(() => props.items));
|
||||
useToggleScope(() => props.renderless, () => {
|
||||
function handleListeners(add = false) {
|
||||
const method = add ? 'addEventListener' : 'removeEventListener';
|
||||
if (!IN_BROWSER) return;
|
||||
if (containerRef.value === document.documentElement) {
|
||||
document[method]('scroll', handleScroll, {
|
||||
passive: true
|
||||
});
|
||||
document[method]('scrollend', handleScrollend);
|
||||
} else {
|
||||
containerRef.value?.[method]('scroll', handleScroll, {
|
||||
passive: true
|
||||
});
|
||||
containerRef.value?.[method]('scrollend', handleScrollend);
|
||||
}
|
||||
}
|
||||
onMounted(() => {
|
||||
containerRef.value = getScrollParent(vm.vnode.el, true);
|
||||
handleListeners(true);
|
||||
});
|
||||
onScopeDispose(handleListeners);
|
||||
});
|
||||
useRender(() => {
|
||||
const children = computedItems.value.map(item => _createVNode(VVirtualScrollItem, {
|
||||
"key": item.key,
|
||||
"renderless": props.renderless,
|
||||
"onUpdate:height": height => handleItemResize(item.index, height)
|
||||
}, {
|
||||
default: slotProps => slots.default?.({
|
||||
item: item.raw,
|
||||
index: item.index,
|
||||
...slotProps
|
||||
})
|
||||
}));
|
||||
return props.renderless ? _createElementVNode(_Fragment, null, [_createElementVNode("div", {
|
||||
"ref": markerRef,
|
||||
"class": "v-virtual-scroll__spacer",
|
||||
"style": {
|
||||
paddingTop: convertToUnit(paddingTop.value)
|
||||
}
|
||||
}, null), children, _createElementVNode("div", {
|
||||
"class": "v-virtual-scroll__spacer",
|
||||
"style": {
|
||||
paddingBottom: convertToUnit(paddingBottom.value)
|
||||
}
|
||||
}, null)]) : _createElementVNode("div", {
|
||||
"ref": containerRef,
|
||||
"class": _normalizeClass(['v-virtual-scroll', props.class]),
|
||||
"onScrollPassive": handleScroll,
|
||||
"onScrollend": handleScrollend,
|
||||
"style": _normalizeStyle([dimensionStyles.value, props.style])
|
||||
}, [_createElementVNode("div", {
|
||||
"ref": markerRef,
|
||||
"class": "v-virtual-scroll__container",
|
||||
"style": {
|
||||
paddingTop: convertToUnit(paddingTop.value),
|
||||
paddingBottom: convertToUnit(paddingBottom.value)
|
||||
}
|
||||
}, [children])]);
|
||||
});
|
||||
return {
|
||||
calculateVisibleItems,
|
||||
scrollToIndex
|
||||
};
|
||||
}
|
||||
});
|
||||
//# sourceMappingURL=VVirtualScroll.js.map
|
||||
Reference in New Issue
Block a user