|
2 | 2 | import { faker } from '@faker-js/faker'
|
3 | 3 | import { createVirtualizer } from '@tanstack/svelte-virtual'
|
4 | 4 |
|
5 |
| - let virtualListEl: HTMLDivElement |
6 |
| - let virtualItemEls: HTMLDivElement[] = [] |
| 5 | + let virtualListEl = $state<HTMLDivElement | null>(null) |
| 6 | + let virtualItemEls = $state<HTMLDivElement[]>([]) |
7 | 7 |
|
8 | 8 | function randomNumber(min: number, max: number) {
|
9 | 9 | return faker.number.int({ min, max })
|
|
15 | 15 |
|
16 | 16 | const count = sentences.length
|
17 | 17 |
|
18 |
| - $: virtualizer = createVirtualizer<HTMLDivElement, HTMLDivElement>({ |
19 |
| - count, |
20 |
| - getScrollElement: () => virtualListEl, |
21 |
| - estimateSize: () => 45, |
22 |
| - }) |
| 18 | + let makeGetScrollElement = (scrollElement: HTMLDivElement | null) => () => |
| 19 | + scrollElement |
| 20 | + let virtualizer = $derived( |
| 21 | + createVirtualizer<HTMLDivElement, HTMLDivElement>({ |
| 22 | + count, |
| 23 | + getScrollElement: makeGetScrollElement(virtualListEl), |
| 24 | + estimateSize: () => 45, |
| 25 | + }), |
| 26 | + ) |
23 | 27 |
|
24 |
| - $: items = $virtualizer.getVirtualItems() |
| 28 | + let items = $derived($virtualizer.getVirtualItems()) |
25 | 29 |
|
26 |
| - $: { |
| 30 | + $effect(() => { |
27 | 31 | if (virtualItemEls.length)
|
28 | 32 | virtualItemEls.forEach((el) => $virtualizer.measureElement(el))
|
29 |
| - } |
| 33 | + }) |
30 | 34 | </script>
|
31 | 35 |
|
32 | 36 | <div>
|
33 | 37 | <button
|
34 |
| - on:click={() => { |
| 38 | + onclick={() => { |
35 | 39 | $virtualizer.scrollToIndex(0)
|
36 | 40 | }}
|
37 | 41 | >
|
38 | 42 | scroll to the top
|
39 | 43 | </button>
|
40 |
| - <span style="padding: 0 4px;" /> |
| 44 | + <span style="padding: 0 4px;"></span> |
41 | 45 | <button
|
42 |
| - on:click={() => { |
| 46 | + onclick={() => { |
43 | 47 | $virtualizer.scrollToIndex(count / 2)
|
44 | 48 | }}
|
45 | 49 | >
|
46 | 50 | scroll to the middle
|
47 | 51 | </button>
|
48 |
| - <span style="padding: 0 4px;" /> |
| 52 | + <span style="padding: 0 4px;"></span> |
49 | 53 | <button
|
50 |
| - on:click={() => { |
| 54 | + onclick={() => { |
51 | 55 | $virtualizer.scrollToIndex(count - 1)
|
52 | 56 | }}
|
53 | 57 | >
|
|
0 commit comments