Install & Download:
npm install vue-virtual-scroll-list --saveDescription:
A Vue component supports big data by using virtual scroll list. Tiny, smooth, and without any dependence.
How to use it:
1. Import and register the component.
import VirtualList from 'vue-virtual-scroll-list'
export default {
components: { 'virtual-list': VirtualList }
}2. Add the virtual-list component to the template.
<template>
<div>
<virtual-list style="height: 400px; overflow-y: auto;"
:data-key="'uid'"
:data-sources="items"
:data-component="itemComponent"
/>
</div>
</template>3. Define your list items.
<template>
<div>{{ index }} - {{ source.text }}</div>
</template>
<script>
export default {
name: 'item-component',
props: {
index: { // number index
type: Number
},
source: { // {uid: 'unique_1', text: 'abc'}
type: Object,
default () {
return {}
}
}
}
}
</script>// root component
import Item from './Item'
import VirtualList from 'vue-virtual-scroll-list'
export default {
name: 'root',
data () {
return {
itemComponent: Item,
items: [{uid: 'unique_1', text: 'abc'}, {uid: 'unique_2', text: 'xyz'}, ...]
}
},
components: { 'virtual-list': VirtualList }
}4. Available props.
dataKey: {
type: [String, Function],
required: true
},
dataSources: {
type: Array,
required: true
},
dataComponent: {
type: [Object, Function],
required: true
},
keeps: {
type: Number,
default: 30
},
extraProps: {
type: Object
},
estimateSize: {
type: Number,
default: 50
},
direction: {
type: String,
default: 'vertical' // the other value is horizontal
},
start: {
type: Number,
default: 0
},
offset: {
type: Number,
default: 0
},
topThreshold: {
type: Number,
default: 0
},
bottomThreshold: {
type: Number,
default: 0
},
pageMode: {
type: Boolean,
default: false
},
rootTag: {
type: String,
default: 'div'
},
wrapTag: {
type: String,
default: 'div'
},
wrapClass: {
type: String,
default: ''
},
wrapStyle: {
type: Object
},
itemTag: {
type: String,
default: 'div'
},
itemClass: {
type: String,
default: ''
},
itemClassAdd: {
type: Function
},
itemStyle: {
type: Object
},
headerTag: {
type: String,
default: 'div'
},
headerClass: {
type: String,
default: ''
},
headerStyle: {
type: Object
},
footerTag: {
type: String,
default: 'div'
},
footerClass: {
type: String,
default: ''
},
footerStyle: {
type: Object
},
itemScopedSlots: {
type: Object
}5. Item props.
index: {
type: Number
},
event: {
type: String
},
tag: {
type: String
},
horizontal: {
type: Boolean
},
source: {
type: Object
},
component: {
type: [Object, Function]
},
slotComponent: {
type: Function
},
uniqueKey: {
type: [String, Number]
},
extraProps: {
type: Object
},
scopedSlots: {
type: Object
}6. Slot props.
event: {
type: String
},
uniqueKey: {
type: String
},
tag: {
type: String
},
horizontal: {
type: Boolean
}7. API methods.
- reset()
- scrollToBottom()
- scrollToIndex(index)
- scrollToOffset(offset)
- getSize(id)
- getSizes()
- getOffset()
- getClientSize()
- getScrollSize()
- updatePageModeFront()
Preview:

Changelog:
v2.3.5 (05/29/2023)
- Bugfixes
v2.3.4 (08/25/2022)
- Bugfix
v2.3.3 (09/06/2021)
- Bugfix
v2.3.2 (11/24/2020)
- Calculate correct average size
v2.3.1 (07/25/2020)
- Fixed TypeError: Unable to get property ‘slotHeaderSize’ of undefined or null reference
- Response to update when `keeps` changes
v2.3.0 (06/18/2020)
- Bugfix





