react-beautiful-dnd 不能与 react-virtualized Table 组件一起正常工作

react-beautiful-dnd doesn’t work properly with react-virtualized Table component

预期行为

使用 DnD 动画从上到下拖动时,行应被拖动到其目标索引,反之亦然。

实际行为

从底部拖动到顶部索引时,行不会出现 DnD。从上到下拖动有效,但该项目是在最后一页索引之后添加的,而不是添加到目标索引中。 DnD 动画效果似乎也不太好。

重现步骤

您可以参考 this 沙箱来重现该问题。

案例 1:从上到下拖动

  1. 尝试从上到下拖动该行索引
  2. 您会看到该行被拖到页面的最后一个索引而不是目标索引

案例 2. 从下到上拖动

  1. 尝试将行从底部拖到顶部索引
  2. 您将观察到行没有被拖动并且没有调用 onDragEnd。

相同的代码适用于 react-virtualized 的列表组件,但不适用于 Table 组件。

您使用的 React 是什么版本?

16.13.0

你 运行ning 是哪个 react-beautiful-dnd 版本?

13.0.0

你 运行ning 是什么版本的 react-virtualized

9.22.3

您使用的是什么浏览器?

Chrome

演示

我创建了这个沙箱来重现这个问题。您可以运行这个来检查问题。

https://codesandbox.io/s/vertical-list-forked-3lp71?file=/index.js

任何人都可以看看沙箱并帮助我吗?如果您需要其他信息,请告诉我!


编辑

所以今天,我调试了这个,并取得了一些进展。看起来问题出在 rowRenderer 实现上。在 defaultRowRenderer 的 dom 之上有一个额外的包装器 div。我能够部分解决这个问题。这是带有更新代码的新 sandbox link

现在,还有一个问题是拖动行时滚动不起作用。任何指示我该如何解决这个问题?

终于解决了问题(不知道这样对不对)。解决方案是将 ref 作为反应虚拟化滚动包装器 div 而不是 react-virtualized 主包装器 div.

我已经用修复程序更新了上面的沙箱。

之前

ref={(ref) => {
                      
     if (ref) {
        // eslint-disable-next-line react/no-find-dom-node
        const whatHasMyLifeComeTo = ReactDOM.findDOMNode(ref);
        if (whatHasMyLifeComeTo instanceof HTMLElement) {
            provided.innerRef(whatHasMyLifeComeTo);
         }
      }
}}

之后(修复)

ref={(ref) => {
       if (ref) {
        const whatHasMyLifeComeTo = document.getElementsByClassName(
          "ReactVirtualized__Grid ReactVirtualized__Table__Grid"
        )[0];
        if (whatHasMyLifeComeTo instanceof HTMLElement) {
          provided.innerRef(whatHasMyLifeComeTo);
        }
      }
}}