svelte-virtual-infinite-list(DEMO)
A virtual list component for Svelte apps. Instead of rendering all your data, <VirtuaInfinitelList>
just renders the bits that are visible, keeping your page nice and light.
This library is forked and extends from @sveltejs/svelte-virtual-list, and all the basic feature of @sveltejs/svelte-virtual-list are available except default slot.
Installation
npm i svelte-virtual-infinite-list
Usage
<script lang="ts">
import VirtualInfiniteList from 'svelte-virtual-infinite-list'
import type { InfiniteEvent } from 'svelte-virtual-infinite-list'
import { find } from './find'
let things = [
{ name: 'one', number: 1 },
{ name: 'two', number: 2 },
{ name: 'three', number: 3 },
{ name: 'six thousand and ninety-two', number: 6092 }
]
let loading = true
let virtualInfiniteList: VirtualInfiniteList
async function onInitialize() {
await virtualInfiniteList.scrollToBottom()
}
async function onInfinite({ detail }: InfiniteEvent) {
if (detail.on === 'bottom') return
loading = true
const data = await find(30)
things = [...data, ...things]
loading = false
}
onMount(async () => {
const data = await find(30)
things = [...data]
loading = false
})
async function scrollToIndex(item) {
const index = things.findIndex((it) => it === item.number)
index && await virtualInfiniteList.scrollToIndex(index)
}
</script>
<VirtualInfiniteList
items={things}
{loading}
direction="top"
persists={30}
uniqueKey={'number'}
on:initialize={onInitialize}
on:infinite={onInfinite}
bind:this={virtualInfiniteList}
let:item
>
<div slot="item">
<p>{item.number}: {item.name}</p>
</div>
<div slot="loader">
Loading...
</div>
<div slot="empty">
Empty
</div>
</VirtualInfiniteList>
Additional Props
No | Property Name | Type | Note |
---|
1 | loading | boolean | - |
2 | direction | 'top' or 'bottom' or 'vertical' | Loading direction. |
3 | maxItemCountPerLoad | number | Deprecated. This valiable removed @2.0.0. Use persists , please. |
4 | persists | number | [For direction-top infinite scroll user] Maximum number of items loaded per load. The offset after loaded may be significantly shift if the number of items that exceeds this value is loaded. Default value is 30. |
5 | uniqueKey | string | You need to set specify one unique property like id in the item object if you want to use the scrollToIndex method. Default value is undefined. |
Additional Events
No | Property Name | Type | Note |
---|
1 | on:initialize | () => any | Emit on change items count from 0 to more over. |
2 | on:infinite | (event: InfiniteEvent) => any | Emit on scrollbar reached top or bottom. |
Additional Slots
No | Slot Name | Note |
---|
1 | item | Displayed item |
2 | loader | Displayed element if loading is true |
3 | empty | Displayed element if items is [] and loading is false |
Additional Methods
No | Method Name | Type | Note |
---|
1 | scrollTo | (offset: number) => Promise<void> | This allows you to scroll to a specific offset. |
2 | scrollToIndex | (index: number, options?: { align: 'top' | 'bottom' | 'center' }) => Promise<boolean> | This allows you to scroll to a specific item using the index. Returns true if this is done. |
3 | scrollToTop | () => Promise<void> | This allows you to scroll to top. |
4 | scrollToBottom | () => Promise<void> | This allows you to scroll to bottom. |
5 | reset | () => Promise<void> | This allows you to reset VirtualInfiniteList. |
6 | forceRefresh | () => Promise<void> | This allows you to tick and render VirtualInfiniteList. |
LICENSE
LIL (original)
LIL+MIT