A Vue 3 implementation of the original VirtualScroller from vue-virtual-scroller
npm install vue-virtual-scroller-classicThis is a vue 3 implementation of the original VirtualScroller from version v0.12.2
of vue-virtual-scroller.
This removes the RecycleScroller and uses the original approach, which means you're safe to use
local component instance data inside the scroller.
The end result is slower rendering, but less implementation specific code, and no need to use idState
The use case this is for is where virtualisation is required to speed up initial page renders on lists where each
component entry has significant local state. But a little bit of loading time is acceptable when components are mounted/unmounted
as the list is scrolled.
For vue 2 feel free to use the original v0.12.2,
in this package all vue 2 -> 3 deprecations are migrated.
- Installation
- Usage
- Example
```
npm install --save vue-virtual-scroller-classic
`javascript
import { createApp } from 'vue'
import { VirtualScroller } from 'vue-virtual-scroller-classic'
import { ObserveVisibility } from 'vue-observe-visibility';
const app = createApp({})
// latest release of dependency vue-observe-visibility uses a vue 2 API, this
// ensures compatibility until next release
app.directive('observe-visibility', {
beforeMount: (el, binding, vnode) => {
vnode.context = binding.instance;
ObserveVisibility.bind(el, binding, vnode);
},
update: ObserveVisibility.update,
unmounted: ObserveVisibility.unbind,
});
app.component('VirtualScroller', VirtualScroller)
`
⚠️ A css file is included when importing the package:
`js`
import 'vue-virtual-scroller-classic/dist/vue-virtual-scroller-classic.css'
`html
`
The virtual scroller has three main props:
- items is the list of items you want to display in the scroller. There can be several types of item.itemHeight
- is the display height of the items in pixels used to calculate the scroll height and position. If it set to null (default value), it will use variable height mode.renderers
- is a map of component definitions objects or names for each item type (more details). If you don't define renderers, the scroller will use scoped slots (see below).
⚠️ You need to set the size of the virtual-scroller element and the items elements (for example, with CSS). Unless you are using variable height mode, all items should have the same height to prevent display glitches.
It is strongly recommended to use functional components inside virtual-scroller since those are cheap to create and dispose.
> The browsers have a height limitation on DOM elements, it means that currently the virtual scroller can't display more than ~500k items depending on the browser.
The optional renderers prop is an object containing a component definition for each possible value of the item type. If you don't set this prop, scoped slots will be used instead. The component definition must have an item prop, that will get the item object to render in the scroller. It will also receive an index prop.
There are additional props you can use:
- typeField to customize which field is used on the items to get their type and use the corresponding definition in the renderers map. The default is 'type'.keyField
- to customize which field is used on the items to set their key special attribute (see the documentation). The default is 'id'.
For better performance, you should use the keyField prop that will set the key attribute. Warning! You shouldn't expect items to have the key set at all times, since the scroller may disable them depending on the situation.
Alternatively, you can use scoped slots instead of renderers. This is active when you don't define the renderers prop on the virtual scroller.
The scope will contain the row's item in the item attribute, so you can write scope="props" and then use props.item. It will also have an index attribute.
Here is an example:
`html
{{props.item.value}} Scoped
For better performance, you should set the
key attribute on direct children using the itemKey field from the scoped slot and set the keyField prop on the virtual scroller.Page mode
The page mode expand the virtual-scroller and use the page viewport to compute which items are visible. That way, you can use it in a big page with HTML elements before or after (like a header and a footer). Just set the
page-mode props to true:`html
`Variable height mode
⚠️ This mode can be performance heavy with a lot of items. Use with caution.
If the
itemHeight prop is not set or set to null, the virtual scroller will switch to Variable height mode. You then need to expose a number field on the item objects with the height of the item element.⚠️ You still need to set the height of the items with CSS correctly (with classes for example).
Use the
heightField prop (default is 'height') to set the field used by the scroller to get the height for each item.Example:
`javascript
const items = [
{
id: 1,
label: 'Title',
height: 64,
},
{
id: 2,
label: 'Foo',
height: 32,
},
{
id: 3,
label: 'Bar',
height: 32,
},
]
`Buffer
You can set the
buffer prop (in pixels) on the virtual-scroller to extend the viewport considered when determining the visible items. For example, if you set a buffer of 1000 pixels, the virtual-scroller will start rendering items that are 1000 pixels below the bottom of the scroller visible area, and will keep the items that are 1000 pixels above the top of the visible area.The default value is
200.`html
`Pool Size
The
poolSize prop (in pixels) is the size in pixels of the viewport pool. The computed 'visible' area can be computed step by step using this pool. This allows creating multiple row at once each in a while. For example, if you set a pool size of 2000 pixels, the rows will be grouped in pools of 2000 pixels height. When the user scrolls too far, the new batch of 2000px height is created, and so on. That way, the DOM isn't updated for each row, but in batches instead.The default value is
2000.`html
`Update event
Set the
emitUpdate boolean prop to true so that the virtual-scroller will emit an update event when the rendered items list is updated. The arguments are startIndex and endIndex.The default value is
false.`html
..." />
`Customizing the tags
These are optional props you can use to change the DOM tags used in the virtual scroller:
-
mainTag to change the DOM tag of the component root element. The default is 'div'.
- containerTag to change the DOM tag of the element simulating the height. The default is 'div'.
- contentTag to change the DOM tag of the element containing the items. The default is 'div'. For example, you can change this to 'table'.The component template is structured like this:
`html
`If you set
contentTag to 'table', the actual result in the DOM will look like the following:`html
`Customizing the classes
You can use the following props to customize the container and content elements CSS classes:
-
containerClass
- contentClass
Slots
There are 4 slots you can use to inject things inside the scroller (it may be usefull to add a
thead or tbody):`html
`Server-Side Rendering
The
prerender props can be set as the number of items to render on the server inside the virtual scroller:`html
`Example
`html
class="scroller"
:items="items"
:renderers="renderers"
item-height="22"
type-field="type">
`Letter.vue source:`html
({{item.index}}) {{item.value}}
`Item.vue source:`html
({{item.index}}) {{item.value.name}}
``