windingwind / zotero-plugin-toolkit

Toolkit for Zotero Plugin Developers.
https://www.npmjs.com/package/zotero-plugin-toolkit
MIT License
115 stars 13 forks source link

使用 VirtualizedTableHelper 创建的表在滚动时标题行会一并滚动,且当条目数较多时加载慢。 #62

Closed StevenGLee closed 2 months ago

StevenGLee commented 2 months ago

目前我正在开发一个插件用于对文献库内的作者进行统计,仓库地址如下:https://github.com/StevenGLee/zotero-author-browser

上述两个问题均可在该插件目前版本的“作者浏览器”功能内复现。

经分析,造成上述两个问题的原因可能是利用 VirtualizedTableHelper 创建的 VirtualizedTable 会一次性渲染(render)所有条目,并在渲染后将整个表作为一个整体进行滚动,而非“显示哪些渲染哪些”。

并且,当条目数较多时加载慢的代码主要位于 windowed-list.js 文件render()中第146行的循环中。

for (let [index, elem] of this._renderedRows.entries()) {
    if (index < startIndex || index >= stopIndex) {
        elem.remove();
        this._renderedRows.delete(index);
    }
}

插件运行在我的文献库中时,上述startIndex的值为0,stopIndex的值为3879(this._renderedRows.size也是3879,该值与data的行数相同),因此循环需要执行很久,导致界面卡死。

Zotero的ItemTree同样使用 VirtualizedTable 实现,可以明显看出在进行滚动时,只有被显示出的条目会被渲染。在上面的代码段中设置断点,发现当鼠标在ItemTree中进行滚动时,render()会被调用,而this._renderedRows.size为70(而总条目数在1000以上),startIndex和stopIndex也是当前屏幕上显示的条目id的边界。

因此,我推测是 VirtualizedTableHelper 在创建 VirtualizedTable 时可能有哪里没有设置正确。

windingwind commented 2 months ago

需要正确引入对应的样式文件。容器元素的样式有问题,导致列表高度无限制以至于显示了所有行。可参考插件https://github.com/windingwind/zotero-actions-tags/blob/682232be78452cb0a64fbba6d111b0dd64565eb4/addon/chrome/content/preferences.xhtml#L8-L12

StevenGLee commented 2 months ago

非常感谢,解决了!