Skip to content

Commit aaa8e02

Browse files
authored
refactor: skip scroll to index when virtualizer has no items (#1971)
1 parent 18973c0 commit aaa8e02

File tree

1 file changed

+21
-10
lines changed

1 file changed

+21
-10
lines changed

packages/vaadin-virtual-list/src/virtualizer-iron-list-adapter.js

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ export class IronListAdapter {
6161
}
6262

6363
scrollToIndex(index) {
64-
if (typeof index !== 'number' || isNaN(index) || !this.scrollTarget.offsetHeight) {
64+
if (typeof index !== 'number' || isNaN(index) || this.size === 0 || !this.scrollTarget.offsetHeight) {
6565
return;
6666
}
6767
index = this._clamp(index, 0, this.size - 1);
@@ -110,7 +110,9 @@ export class IronListAdapter {
110110

111111
__updateElement(el, index) {
112112
// Clean up temporary min height
113-
el.style.minHeight = '';
113+
if (el.style.minHeight) {
114+
el.style.minHeight = '';
115+
}
114116

115117
this.updateElement(el, index);
116118

@@ -133,21 +135,30 @@ export class IronListAdapter {
133135
return;
134136
}
135137

136-
let fvi = this.firstVisibleIndex + this._vidxOffset;
137-
138-
const fviOffsetBefore = this.__getIndexScrollOffset(fvi);
138+
// Record the scroll position before changing the size
139+
let fvi; // first visible index
140+
let fviOffsetBefore; // scroll offset of the first visible index
141+
if (size > 0) {
142+
fvi = this.firstVisibleIndex + this._vidxOffset;
143+
fviOffsetBefore = this.__getIndexScrollOffset(fvi);
144+
}
139145

146+
// Change the size
140147
this.__size = size;
141148
this._itemsChanged({
142149
path: 'items'
143150
});
151+
flush();
144152

145-
fvi = Math.min(fvi, size - 1);
146-
this.scrollToIndex(fvi);
153+
// Try to restore the scroll position if the new size is larger than 0
154+
if (size > 0) {
155+
fvi = Math.min(fvi, size - 1);
156+
this.scrollToIndex(fvi);
147157

148-
const fviOffsetAfter = this.__getIndexScrollOffset(fvi);
149-
if (fviOffsetBefore !== undefined && fviOffsetAfter !== undefined) {
150-
this._scrollTop += fviOffsetBefore - fviOffsetAfter;
158+
const fviOffsetAfter = this.__getIndexScrollOffset(fvi);
159+
if (fviOffsetBefore !== undefined && fviOffsetAfter !== undefined) {
160+
this._scrollTop += fviOffsetBefore - fviOffsetAfter;
161+
}
151162
}
152163

153164
if (!this.elementsContainer.children.length) {

0 commit comments

Comments
 (0)