【发布时间】:2017-03-10 07:03:18
【问题描述】:
说明
我有一个可能很长的项目列表,在反应虚拟化 VirtualScroll 中呈现。
列表中的每个项目(行)都有相当多的元素,其中一个会打开上下文菜单。我正在尝试使用 react-tether 在 HTML body 上呈现该菜单(这样当项目位于可滚动列表的底部/顶部时它不会隐藏)并保持菜单“卡在”我的项目上用户滚动列表。
我的问题是更新绑定菜单的位置有明显的滞后。
到目前为止我已采取的一些步骤:
- 呈现了一个简单的列表,没有
VirtualScroll。系留菜单呈现流畅,没有明显的卡顿。这就是我得出的结论,问题出在react-virtualized - 将我的
rowRenderer简化为只有菜单触发器,如recommended here。 - 在行组件中实现
shouldComponentUpdate。这大大提高了感知性能,大大减少了延迟,但仍然很明显。 - 检查了 Chrome 开发工具的时间线。我看到
Grid.js和tether.js都触发了回流。
库版本:
- react-virtualized v. 7.24.3(大型项目,尚未准备好升级到 8.x)
- react-tether v. 0.5.2
- 反应 v. 15.2.1
工作演示
https://plnkr.co/edit/f7OhCoCXkDsWbyjxhR3f
截图:
【问题讨论】:
-
"检查了 Chrome devtools 的时间线。我看到 Grid.js 和 tether.js 触发了回流。" - 不确定 Tether,但在 react-virtualized v8 中我对上游
detect-element-resize库进行了 2 个重要的性能优化,防止它进行大量不必要的回流。如果您使用的是AutoSizer,此更改可能会对您有所帮助。 (如果你不是,那么它就无关紧要了。)如果你能与我分享一些代码,我很乐意看看你的问题——即使它只是一个小的 Plnkr。 -
@brianvaughn 感谢您的快速回复。 1. 我不使用
AutoSizer,而是使用我们自己的自定义调整大小处理程序。如果是这样,我可能会尝试升级到 8.x 并切换到AutoSizer2。我会看看我是否可以设置一个可共享的示例。无论如何,隔离问题可能是个好主意 -
@brianvaughn 我用 splunkr 上的工作演示链接更新了我的问题。延迟是可见的。
标签: javascript performance reactjs react-virtualized tether