Skip to content

Commit 7b21326

Browse files
authored
tests(solid-virtual): add reactivity tests
1 parent 36a6143 commit 7b21326

1 file changed

Lines changed: 44 additions & 0 deletions

File tree

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import { describe, expect, it } from 'vitest'
2+
import { createRoot, createSignal } from 'solid-js'
3+
import { unwrap } from 'solid-js/store'
4+
import { createVirtualizer } from '../src/index'
5+
6+
describe('reactivity: unaffected slots keep stable references', () => {
7+
it('does not recreate VirtualItem objects for slots whose data did not change', () => {
8+
createRoot((dispose) => {
9+
const data = Array.from({ length: 50 }, (_, i) => `item-${i}`)
10+
const [filtered, setFiltered] = createSignal(data)
11+
12+
const virtualizer = createVirtualizer({
13+
get count() {
14+
return filtered().length
15+
},
16+
getScrollElement: () => document.createElement('div'),
17+
estimateSize: () => 30,
18+
overscan: 0,
19+
})
20+
21+
const before = virtualizer.getVirtualItems()
22+
const beforeRefs = before.map((item) => unwrap(item))
23+
24+
// Shrink the array; leaves the first visible rows' index/start/end/size untouched.
25+
setFiltered(data.slice(0, 40))
26+
27+
const after = virtualizer.getVirtualItems()
28+
const afterRefs = after.map((item) => unwrap(item))
29+
30+
const unaffectedCount = Math.min(beforeRefs.length, afterRefs.length)
31+
for (let i = 0; i < unaffectedCount; i++) {
32+
if (
33+
beforeRefs[i].start === afterRefs[i].start &&
34+
beforeRefs[i].end === afterRefs[i].end &&
35+
beforeRefs[i].index === afterRefs[i].index
36+
) {
37+
expect(afterRefs[i]).toBe(beforeRefs[i])
38+
}
39+
}
40+
41+
dispose()
42+
})
43+
})
44+
})

0 commit comments

Comments
 (0)