From 5ccde704514081648b425a4bf7292069729101f5 Mon Sep 17 00:00:00 2001 From: water <672684719@qq.com> Date: Wed, 12 Aug 2026 13:32:15 +0800 Subject: [PATCH 1/2] fix(lit-virtual): add setOptions to VirtualizerController for reactive option updates --- packages/lit-virtual/src/index.ts | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/packages/lit-virtual/src/index.ts b/packages/lit-virtual/src/index.ts index 963454fdb..bddbe8706 100644 --- a/packages/lit-virtual/src/index.ts +++ b/packages/lit-virtual/src/index.ts @@ -18,12 +18,15 @@ class VirtualizerControllerBase< private readonly virtualizer: Virtualizer + private options: VirtualizerOptions + private cleanup: () => void = () => {} constructor( host: ReactiveControllerHost, options: VirtualizerOptions, ) { + this.options = options const resolvedOptions: VirtualizerOptions = { ...options, onChange: (instance, sync) => { @@ -39,6 +42,21 @@ class VirtualizerControllerBase< return this.virtualizer } + public setOptions( + options: Partial>, + ) { + this.options = { ...this.options, ...options } + const resolvedOptions: VirtualizerOptions = { + ...this.options, + onChange: (instance, sync) => { + this.host.updateComplete.then(() => this.host.requestUpdate()) + this.options.onChange?.(instance, sync) + }, + } + this.virtualizer.setOptions(resolvedOptions) + this.virtualizer._willUpdate() + } + hostConnected() { this.cleanup = this.virtualizer._didMount() } From e548dedf7d905d059725f7eb57e8a56319ec7ffa Mon Sep 17 00:00:00 2001 From: water <672684719@qq.com> Date: Wed, 12 Aug 2026 13:33:06 +0800 Subject: [PATCH 2/2] test(lit-virtual): add setOptions test for reactive option updates --- packages/lit-virtual/tests/index.test.ts | 71 ++++++++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/packages/lit-virtual/tests/index.test.ts b/packages/lit-virtual/tests/index.test.ts index 8add1b971..d06115ad0 100644 --- a/packages/lit-virtual/tests/index.test.ts +++ b/packages/lit-virtual/tests/index.test.ts @@ -113,3 +113,74 @@ test('should render virtual items', async () => { 'Element did not render virtual items', ) }) + +test('should apply updated options via setOptions', async () => { + @customElement('test-list-setoptions' as any) + class ListSetOptions extends LitElement { + private scrollElementRef: Ref = createRef() + + private virtualizerController: VirtualizerController + + constructor() { + super() + this.virtualizerController = new VirtualizerController(this, { + getScrollElement: () => this.scrollElementRef.value, + count: 10, + estimateSize: () => 50, + observeElementRect: (_, cb) => { + cb({ height, width }) + }, + }) + } + + render() { + this.virtualizerController.setOptions({ + count: 20, + }) + const virtualizer = this.virtualizerController.getVirtualizer() + const virtualRows = virtualizer.getVirtualItems() + return html` +
+
+
+ ${repeat( + virtualRows, + (virtualRow: any) => virtualRow.key, + (virtualRow: any) => + html`
+
+
Row ${virtualRow.index}
+
Item ${virtualRow.index}
+
+
`, + )} +
+
+
+ + ` + } + } + + const el = await fixture(html`` as any) + await elementUpdated(el) + await waitUntil( + () => el.shadowRoot.querySelector('[data-index="15"]'), + 'Element did not render items beyond initial count of 10', + ) + expect(el.shadowRoot.querySelector('[data-index="15"]')).toBeTruthy() +}) \ No newline at end of file