From dc2c5f41b011f1c2364ec0b2cb11bd39ce4a0742 Mon Sep 17 00:00:00 2001 From: j4hangir Date: Fri, 2 Jan 2026 21:50:59 +0100 Subject: [PATCH 1/4] add keepAliveOnHidden option in order to prevent mount/unmount on visibility changes --- packages/virtual-core/src/index.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/packages/virtual-core/src/index.ts b/packages/virtual-core/src/index.ts index 34c51c5b..85e871d6 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, } } @@ -499,6 +501,13 @@ export class Virtualizer< : null if (this.scrollElement !== scrollElement) { + if (!scrollElement && this.options.keepAliveOnHidden && this.scrollElement?.isConnected) { + // We won't call cleanup() here. Keep everything in memory. + // Ensure any external subscribers are notified that the state changed. + this.maybeNotify() + return + } + this.cleanup() if (!scrollElement) { From aff6e4f4c6e241e28b6274f65f7c58b634374750 Mon Sep 17 00:00:00 2001 From: j4hangir Date: Sat, 3 Jan 2026 00:21:12 +0100 Subject: [PATCH 2/4] remove broken return --- packages/virtual-core/src/index.ts | 7 ------- 1 file changed, 7 deletions(-) diff --git a/packages/virtual-core/src/index.ts b/packages/virtual-core/src/index.ts index 85e871d6..9496ce8f 100644 --- a/packages/virtual-core/src/index.ts +++ b/packages/virtual-core/src/index.ts @@ -501,13 +501,6 @@ export class Virtualizer< : null if (this.scrollElement !== scrollElement) { - if (!scrollElement && this.options.keepAliveOnHidden && this.scrollElement?.isConnected) { - // We won't call cleanup() here. Keep everything in memory. - // Ensure any external subscribers are notified that the state changed. - this.maybeNotify() - return - } - this.cleanup() if (!scrollElement) { From fde6c6421026ba0711ca3794f19cd1893ca7fbd0 Mon Sep 17 00:00:00 2001 From: j4hangir Date: Sat, 3 Jan 2026 00:43:57 +0100 Subject: [PATCH 3/4] fix keepAliveOnHidden --- packages/virtual-core/src/index.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/packages/virtual-core/src/index.ts b/packages/virtual-core/src/index.ts index 9496ce8f..bf7124b9 100644 --- a/packages/virtual-core/src/index.ts +++ b/packages/virtual-core/src/index.ts @@ -795,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(), @@ -803,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({ From 83ad2f6d19cc730d3fc16c967c543607b9b4200e Mon Sep 17 00:00:00 2001 From: j4hangir Date: Sat, 3 Jan 2026 03:42:11 +0100 Subject: [PATCH 4/4] fix keepActiveOnHidden not working on measured items --- packages/virtual-core/src/index.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/virtual-core/src/index.ts b/packages/virtual-core/src/index.ts index bf7124b9..382d3a5b 100644 --- a/packages/virtual-core/src/index.ts +++ b/packages/virtual-core/src/index.ts @@ -882,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) {