From 67567d402da7576fde8f6ae25282373656b7e61e Mon Sep 17 00:00:00 2001 From: Damian Pieczynski Date: Mon, 27 Feb 2023 11:57:22 +0100 Subject: [PATCH] feat: add elementKeyAttribute, controls element cache --- packages/virtual-core/src/index.ts | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) 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)