diff --git a/packages/virtual-core/src/index.ts b/packages/virtual-core/src/index.ts index 4786e5182..dcc2a9cb2 100644 --- a/packages/virtual-core/src/index.ts +++ b/packages/virtual-core/src/index.ts @@ -259,6 +259,7 @@ export interface VirtualizerOptions< rangeExtractor?: (range: Range) => number[] scrollMargin?: number scrollingDelay?: number + elementKeyAttribute?: string indexAttribute?: string initialMeasurementsCache?: VirtualItem[] } @@ -344,6 +345,7 @@ export class Virtualizer< scrollMargin: 0, scrollingDelay: 150, indexAttribute: 'data-index', + elementKeyAttribute: 'data-element-key', initialMeasurementsCache: [], ...opts, } @@ -561,17 +563,17 @@ export class Virtualizer< ) => { const index = this.indexFromElement(node) - const item = this.measurementsCache[index] - if (!item) { - return - } + const item = notUndefined(this.measurementsCache[index]) + + const elementKey = + node.getAttribute(this.options.elementKeyAttribute) ?? item.key - const prevNode = this.measureElementCache.get(item.key) + const prevNode = this.measureElementCache.get(elementKey) if (!node.isConnected) { this.observer.unobserve(node) if (node === prevNode) { - this.measureElementCache.delete(item.key) + this.measureElementCache.delete(elementKey) } return } @@ -581,7 +583,7 @@ export class Virtualizer< this.observer.unobserve(prevNode) } this.observer.observe(node) - this.measureElementCache.set(item.key, node) + this.measureElementCache.set(elementKey, node) } const measuredItemSize = this.options.measureElement(node, entry, this)