line_push/node_modules/vuetify/lib/components/VVirtualScroll/VVirtualScroll.js
2022-07-21 03:28:35 +00:00

118 lines
2.5 KiB
JavaScript

// Styles
import "../../../src/components/VVirtualScroll/VVirtualScroll.sass"; // Mixins
import Measurable from '../../mixins/measurable'; // Directives
import Scroll from '../../directives/scroll'; // Utilities
import { convertToUnit, getSlot } from '../../util/helpers';
export default Measurable.extend({
name: 'v-virtual-scroll',
directives: {
Scroll
},
props: {
bench: {
type: [Number, String],
default: 0
},
itemHeight: {
type: [Number, String],
required: true
},
items: {
type: Array,
default: () => []
}
},
data: () => ({
first: 0,
last: 0,
scrollTop: 0
}),
computed: {
__bench() {
return parseInt(this.bench, 10);
},
__itemHeight() {
return parseInt(this.itemHeight, 10);
},
firstToRender() {
return Math.max(0, this.first - this.__bench);
},
lastToRender() {
return Math.min(this.items.length, this.last + this.__bench);
}
},
watch: {
height: 'onScroll',
itemHeight: 'onScroll'
},
mounted() {
this.last = this.getLast(0);
},
methods: {
getChildren() {
return this.items.slice(this.firstToRender, this.lastToRender).map(this.genChild);
},
genChild(item, index) {
index += this.firstToRender;
const top = convertToUnit(index * this.__itemHeight);
return this.$createElement('div', {
staticClass: 'v-virtual-scroll__item',
style: {
top
},
key: index
}, getSlot(this, 'default', {
index,
item
}));
},
getFirst() {
return Math.floor(this.scrollTop / this.__itemHeight);
},
getLast(first) {
const height = parseInt(this.height || 0, 10) || this.$el.clientHeight;
return first + Math.ceil(height / this.__itemHeight);
},
onScroll() {
this.scrollTop = this.$el.scrollTop;
this.first = this.getFirst();
this.last = this.getLast(this.first);
}
},
render(h) {
const content = h('div', {
staticClass: 'v-virtual-scroll__container',
style: {
height: convertToUnit(this.items.length * this.__itemHeight)
}
}, this.getChildren());
return h('div', {
staticClass: 'v-virtual-scroll',
style: this.measurableStyles,
directives: [{
name: 'scroll',
modifiers: {
self: true
},
value: this.onScroll
}]
}, [content]);
}
});
//# sourceMappingURL=VVirtualScroll.js.map