LitElement 无限滚动重定位问题
LitElement infinite scroll reposition issue
我正在为限制列表 DOM 计数的 LitElement 无限滚动条创建 POC。该组件基于此:https://medium.com/walmartglobaltech/infinite-scrolling-the-right-way-11b098a08815
我的 POC 在这里:https://stackblitz.com/edit/lit-element-infinite-scroller-poc
item定位是通过调整paddings,在触发IntersectionObserver时更新list item内容来实现的。
当组件从上到下快速滚动时,它工作正常。当您放慢滚动速度时,它有时会在达到 IntersectionObserver 的阈值之前添加一个填充。至于从下往上滚动,无论快慢滚动,它总是这样。
我猜这是一个时间问题,但我无法确定确切位置。
我不确定重新发明轮子并自己实现无限滚动是否是个好主意,但对于您的代码,问题似乎出在 _getNewTopItemIndex
方法中,特别是当 isScrollDown
是false 你似乎在那里打错了,因为那部分与你在问题中提到的媒介 post 不一样。
_getNewTopItemIndex(isScrollDown) {
const increment = this.listSize / 2;
const newIndex = isScrollDown
? this._top.index + increment
: this._top.index - increment; // original code: this._top.index - increment - this.listSize;
return newIndex < 0 ? 0 : newIndex;
}
当元素滚动和主体滚动音符匹配时,似乎存在少量差异,这来自您示例中主体的边距,<style>body{margin:0}</style>
似乎已将其清理干净并在结合 Dipen 的打字错误,您似乎正在寻找可靠的解决方案。
https://stackblitz.com/edit/lit-element-infinite-scroller-poc-fccmn1?file=index.html
正如 Dipen 所说,我觉得 _getNewTopItemIndex
可以优化,但实际上如果您看到 lit-visualizer
执行此实现非常费力。
建议大家不要重新发明轮子,可以用lit-virtualizer
试试
npm i lit-virtualizer
我认为您还需要其他可以与项目协作的东西 (https://github.com/polymerlabs/uni-virtualizer)
示例:
render() {
return html`
<lit-virtualizer
.scrollTarget=${window}
.items=${this.data}
.renderItem=${(contact) => html`
<div><b>${contact.name}</b>: ${contact.phone}</div>
`}>
</lit-virtualizer>
`;
}
我正在为限制列表 DOM 计数的 LitElement 无限滚动条创建 POC。该组件基于此:https://medium.com/walmartglobaltech/infinite-scrolling-the-right-way-11b098a08815
我的 POC 在这里:https://stackblitz.com/edit/lit-element-infinite-scroller-poc
item定位是通过调整paddings,在触发IntersectionObserver时更新list item内容来实现的。
当组件从上到下快速滚动时,它工作正常。当您放慢滚动速度时,它有时会在达到 IntersectionObserver 的阈值之前添加一个填充。至于从下往上滚动,无论快慢滚动,它总是这样。
我猜这是一个时间问题,但我无法确定确切位置。
我不确定重新发明轮子并自己实现无限滚动是否是个好主意,但对于您的代码,问题似乎出在 _getNewTopItemIndex
方法中,特别是当 isScrollDown
是false 你似乎在那里打错了,因为那部分与你在问题中提到的媒介 post 不一样。
_getNewTopItemIndex(isScrollDown) {
const increment = this.listSize / 2;
const newIndex = isScrollDown
? this._top.index + increment
: this._top.index - increment; // original code: this._top.index - increment - this.listSize;
return newIndex < 0 ? 0 : newIndex;
}
当元素滚动和主体滚动音符匹配时,似乎存在少量差异,这来自您示例中主体的边距,<style>body{margin:0}</style>
似乎已将其清理干净并在结合 Dipen 的打字错误,您似乎正在寻找可靠的解决方案。
https://stackblitz.com/edit/lit-element-infinite-scroller-poc-fccmn1?file=index.html
正如 Dipen 所说,我觉得 _getNewTopItemIndex
可以优化,但实际上如果您看到 lit-visualizer
执行此实现非常费力。
建议大家不要重新发明轮子,可以用lit-virtualizer
试试
npm i lit-virtualizer
我认为您还需要其他可以与项目协作的东西 (https://github.com/polymerlabs/uni-virtualizer)
示例:
render() {
return html`
<lit-virtualizer
.scrollTarget=${window}
.items=${this.data}
.renderItem=${(contact) => html`
<div><b>${contact.name}</b>: ${contact.phone}</div>
`}>
</lit-virtualizer>
`;
}