diff --git a/packages/virtual-core/src/index.ts b/packages/virtual-core/src/index.ts index 34c51c5b..382d3a5b 100644 --- a/packages/virtual-core/src/index.ts +++ b/packages/virtual-core/src/index.ts @@ -348,6 +348,7 @@ export interface VirtualizerOptions< enabled?: boolean isRtl?: boolean useAnimationFrameWithResizeObserver?: boolean + keepAliveOnHidden?: boolean } export class Virtualizer< @@ -447,6 +448,7 @@ export class Virtualizer< isRtl: false, useScrollendEvent: false, useAnimationFrameWithResizeObserver: false, + keepAliveOnHidden: false, ...opts, } } @@ -793,6 +795,14 @@ export class Virtualizer< }, ) + private isVisible = () => { + if (!this.scrollElement) return false + return ( + this.scrollElement instanceof Window || + (this.scrollElement as HTMLElement).offsetWidth > 0 + ) + } + calculateRange = memo( () => [ this.getMeasurements(), @@ -801,6 +811,9 @@ export class Virtualizer< this.options.lanes, ], (measurements, outerSize, scrollOffset, lanes) => { + if (this.options.keepAliveOnHidden && !this.isVisible()) { + return this.range + } return (this.range = measurements.length > 0 && outerSize > 0 ? calculateRange({ @@ -869,6 +882,9 @@ export class Virtualizer< node: TItemElement, entry: ResizeObserverEntry | undefined, ) => { + if (this.options.keepAliveOnHidden && !this.isVisible()) { + return + } const index = this.indexFromElement(node) const item = this.measurementsCache[index] if (!item) {