Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/quiet-cats-preserve.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@tanstack/solid-virtual': patch
---

Preserve measured item sizes when reactive virtualizer options change.
2 changes: 2 additions & 0 deletions packages/solid-virtual/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@
"clean": "premove ./dist ./coverage",
"test:eslint": "eslint ./src",
"test:types": "tsc",
"test:lib": "vitest",
"test:lib:dev": "pnpm run test:lib --watch",
Comment thread
Hona marked this conversation as resolved.
"test:build": "publint --strict",
"build": "vite build"
},
Expand Down
4 changes: 3 additions & 1 deletion packages/solid-virtual/src/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,9 @@ function createVirtualizerBase<
},
}),
)
virtualizer.measure()
virtualizer._willUpdate()
setVirtualItems(reconcile(instance.getVirtualItems(), { key: 'index' }))
setTotalSize(instance.getTotalSize())
Comment thread
Hona marked this conversation as resolved.
})

return virtualizer
Expand Down
28 changes: 28 additions & 0 deletions packages/solid-virtual/tests/index.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import { expect, test } from 'vitest'
import { createRoot, createSignal } from 'solid-js'

import { createVirtualizer } from '../src/index'

test('preserves measured sizes when reactive options change', () => {
createRoot((dispose) => {
const [count, setCount] = createSignal(2)
const virtualizer = createVirtualizer<HTMLDivElement, HTMLDivElement>({
get count() {
return count()
},
getScrollElement: () => null,
estimateSize: () => 60,
initialRect: { width: 800, height: 600 },
})

expect(virtualizer.getTotalSize()).toBe(120)
virtualizer.resizeItem(0, 100)
expect(virtualizer.getTotalSize()).toBe(160)

setCount(3)

expect(virtualizer.itemSizeCache.get(0)).toBe(100)
Comment thread
Hona marked this conversation as resolved.
expect(virtualizer.getTotalSize()).toBe(220)
dispose()
})
Comment thread
Hona marked this conversation as resolved.
})