BlogPlaygroundOne

Infinite scrollers

The v-infinite-scroll component displays a potentially infinite list, by loading more items of the list when scrolling. It supports either vertical or horizontal scrolling.

Usage

When scrolling towards the bottom, new items will be rendered either automatically, or manually with the click of a button.

Item number 1
Item number 2
Item number 3
Item number 4
Item number 5
Item number 6
Item number 7
Item number 8
Item number 9
Item number 10
Item number 11
Item number 12
Item number 13
Item number 14
Item number 15
Item number 16
Item number 17
Item number 18
Item number 19
Item number 20
Item number 21
Item number 22
Item number 23
Item number 24
Item number 25
Item number 26
Item number 27
Item number 28
Item number 29
Item number 30
 
<v-infinite-scroll :height="300" @load="load"> <template v-for="(item, index) in items" :key="item"> <div :class="['pa-2', index % 2 === 0 ? 'bg-grey-lighten-2' : '']"> Item number #{{ item }} </div> </template> </v-infinite-scroll>
<script setup> import { ref } from 'vue' const items = ref(Array.from({ length: 30 }, (k, v) => v + 1)) async function api () { return new Promise(resolve => { setTimeout(() => { resolve(Array.from({ length: 10 }, (k, v) => v + items.value.at(-1) + 1)) }, 1000) }) } async function load ({ done }) { // Perform API call const res = await api() items.value.push(...res) done('ok') } </script>

A load event will be emitted when the component needs to load more content. The argument passed is an object with two properties.

  • side tells you on which side new content should be added, either at the 'start' or 'end'. The return value of the function is a string that describes if the new content was loaded successfully or not.
  • done is a callback function that should be called when the loading of new content is done. It takes a single parameter status that describes if the load was successful or not. See the table below for the possible values.
StatusDescription
'ok'Content was added successfully
'error'Something went wrong when adding content. This will display the error slot
'empty'There is no more content to fetch. This will display the empty slot
'loading'Content is currently loading. This will display a message that the content is loading. This status is only set internally by the component and should not be used with the done function

API

ComponentDescription
v-infinite-scrollPrimary Component
Toggle Inline API

Anatomy

The v-infinite-scroll works with any content in its default slot.

Element / AreaDescription
1. ContainerThe infinite scroller content container
2. LoaderThe loader content area

Guide

The v-infinite-scroll component is a container that allows you to react to a user reaching the end of the content area. It is useful when you need to display an unknown but large number of items, and you don’t want to load them all at once.

Props

The v-infinite-scroll component has several props that can be used to customize its behavior.

Mode

The default behavior of the component is to try to load more content automatically when the scrollbar gets close to the end. However, a manual mode is also supported, where the user needs to do some interaction to load the content. By default this is a button, but it can be customized with a slot

Item number 1
Item number 2
Item number 3
Item number 4
Item number 5
Item number 6
Item number 7
Item number 8
Item number 9
Item number 10
Item number 11
Item number 12
Item number 13
Item number 14
Item number 15
Item number 16
Item number 17
Item number 18
Item number 19
Item number 20
Item number 21
Item number 22
Item number 23
Item number 24
Item number 25
Item number 26
Item number 27
Item number 28
Item number 29
Item number 30
Item number 31
Item number 32
Item number 33
Item number 34
Item number 35
Item number 36
Item number 37
Item number 38
Item number 39
Item number 40
Item number 41
Item number 42
Item number 43
Item number 44
Item number 45
Item number 46
Item number 47
Item number 48
Item number 49
Item number 50

Direction

The v-infinite-scroll component can be used with either vertical or horizontal scrolling.

Item #1
Item #2
Item #3
Item #4
Item #5
Item #6
Item #7
Item #8
Item #9
Item #10
Item #11
Item #12
Item #13
Item #14
Item #15
Item #16
Item #17
Item #18
Item #19
Item #20
Item #21
Item #22
Item #23
Item #24
Item #25
Item #26
Item #27
Item #28
Item #29
Item #30
Item #31
Item #32
Item #33
Item #34
Item #35
Item #36
Item #37
Item #38
Item #39
Item #40
Item #41
Item #42
Item #43
Item #44
Item #45
Item #46
Item #47
Item #48
Item #49
Item #50
 

Side

By default, the v-infinite-scroll component assumes that new content will appear at the end of existing content. But it also supports content being added to the start and appearing both at the beginning and the end.

When using the start side for content, the scrollbar will start at the bottom of the content.

 
Item number 1
Item number 2
Item number 3
Item number 4
Item number 5
Item number 6
Item number 7
Item number 8
Item number 9
Item number 10
Item number 11
Item number 12
Item number 13
Item number 14
Item number 15
Item number 16
Item number 17
Item number 18
Item number 19
Item number 20
Item number 21
Item number 22
Item number 23
Item number 24
Item number 25
Item number 26
Item number 27
Item number 28
Item number 29
Item number 30
Item number 31
Item number 32
Item number 33
Item number 34
Item number 35
Item number 36
Item number 37
Item number 38
Item number 39
Item number 40
Item number 41
Item number 42
Item number 43
Item number 44
Item number 45
Item number 46
Item number 47
Item number 48
Item number 49
Item number 50

When using both sides for content, the scrollbar will start in the middle of the content.

 
Item number 1
Item number 2
Item number 3
Item number 4
Item number 5
Item number 6
Item number 7
Item number 8
Item number 9
Item number 10
Item number 11
Item number 12
Item number 13
Item number 14
Item number 15
Item number 16
Item number 17
Item number 18
Item number 19
Item number 20
Item number 21
Item number 22
Item number 23
Item number 24
Item number 25
Item number 26
Item number 27
Item number 28
Item number 29
Item number 30
Item number 31
Item number 32
Item number 33
Item number 34
Item number 35
Item number 36
Item number 37
Item number 38
Item number 39
Item number 40
Item number 41
Item number 42
Item number 43
Item number 44
Item number 45
Item number 46
Item number 47
Item number 48
Item number 49
Item number 50
 

Color

The default load more button and loading spinner can be colored with the color prop.

Item #1
Item #2
Item #3
Item #4
Item #5
Item #6
Item #7
Item #8
Item #9
Item #10
Item #11
Item #12
Item #13
Item #14
Item #15
Item #16
Item #17
Item #18
Item #19
Item #20
Item #21
Item #22
Item #23
Item #24
Item #25
Item #26
Item #27
Item #28
Item #29
Item #30
Item #31
Item #32
Item #33
Item #34
Item #35
Item #36
Item #37
Item #38
Item #39
Item #40
Item #41
Item #42
Item #43
Item #44
Item #45
Item #46
Item #47
Item #48
Item #49
Item #50

Slots

The v-infinite-scroll component exposes several slots that allow you to further customize its behaviour.

Element / AreaDescription
1. ContainerThe default slot
2. Load-moreThe slot shown when the mode is set to manual and the status is not loading
3. LoadingThe slot is shown when the mode is set to manual and status is loading
4. EmptyThe slot shown when the status is empty
5. ErrorThe slot is shown when the status is error

Loading

You can customize the loading message with the loading slot.

Item #1
Item #2
Item #3
Item #4
Item #5
Item #6
Item #7
Item #8
Item #9
Item #10
Item #11
Item #12
Item #13
Item #14
Item #15
Item #16
Item #17
Item #18
Item #19
Item #20
Item #21
Item #22
Item #23
Item #24
Item #25
Item #26
Item #27
Item #28
Item #29
Item #30
Item #31
Item #32
Item #33
Item #34
Item #35
Item #36
Item #37
Item #38
Item #39
Item #40
Item #41
Item #42
Item #43
Item #44
Item #45
Item #46
Item #47
Item #48
Item #49
Item #50
 
This is taking a very long time...

Load more

When using manual mode you can customize the action required to load more content with the load-more slot.

Item #1
Item #2
Item #3
Item #4
Item #5
Item #6
Item #7
Item #8
Item #9
Item #10
Item #11
Item #12
Item #13
Item #14
Item #15
Item #16
Item #17
Item #18
Item #19
Item #20
Item #21
Item #22
Item #23
Item #24
Item #25
Item #26
Item #27
Item #28
Item #29
Item #30
Item #31
Item #32
Item #33
Item #34
Item #35
Item #36
Item #37
Item #38
Item #39
Item #40
Item #41
Item #42
Item #43
Item #44
Item #45
Item #46
Item #47
Item #48
Item #49
Item #50

Empty

You can customize the empty message with the empty slot.

Item #1
Item #2
Item #3
Item #4
Item #5
Item #6
Item #7
Item #8
Item #9
Item #10
Item #11
Item #12
Item #13
Item #14
Item #15
Item #16
Item #17
Item #18
Item #19
Item #20
Item #21
Item #22
Item #23
Item #24
Item #25
Item #26
Item #27
Item #28
Item #29
Item #30
Item #31
Item #32
Item #33
Item #34
Item #35
Item #36
Item #37
Item #38
Item #39
Item #40
Item #41
Item #42
Item #43
Item #44
Item #45
Item #46
Item #47
Item #48
Item #49
Item #50
 

Error

The error slot is shown if the status 'error' is returned from the done callback.

Item #1
Item #2
Item #3
Item #4
Item #5
Item #6
Item #7
Item #8
Item #9
Item #10
Item #11
Item #12
Item #13
Item #14
Item #15
Item #16
Item #17
Item #18
Item #19
Item #20
Item #21
Item #22
Item #23
Item #24
Item #25
Item #26
Item #27
Item #28
Item #29
Item #30
Item #31
Item #32
Item #33
Item #34
Item #35
Item #36
Item #37
Item #38
Item #39
Item #40
Item #41
Item #42
Item #43
Item #44
Item #45
Item #46
Item #47
Item #48
Item #49
Item #50
 

Misc

Exposed properties

The v-infinite-scroll component exposes the reset() method, allowing to programatically reset the status to the default after reaching the empty state. This makes it possible for load to be called again. An optional ‘side’ parameter can also be provided to the method for cases where only one of the two sides needs to be reset.

Server items: 30
Loaded items: 0
 
 

Examples

The following is a collection of examples that demonstrate more advanced and real-world use of the v-infinite-scroll component.

Virtualized infinite scroller

If the items in your infinite list are of a uniform size, you can quite easily virtualize the list to only render a small number of items regardless of how far you scroll in either direction.

 
1
2
3
4
5
6
7
8
9
10
11
12
 

Ready for more?

Continue your learning with related content selected by the Team or move between pages by using the navigation links below.