|
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