无法让 React-Beautiful-DND 和 React-Virtualized 一起工作

Posted

技术标签:

【中文标题】无法让 React-Beautiful-DND 和 React-Virtualized 一起工作【英文标题】:Cannot get React-Beautiful-DND and React-Virtualized to work together 【发布时间】:2021-05-25 12:21:06 【问题描述】:

伙计们,我实际上已经尝试了几天,但我一直无法弄清楚这一点。我可以让两个库单独工作,但我不知道为什么当我将两者结合起来时它不会工作。我想我以某种方式将它们连接错了,我只是无法弄清楚它是什么。请帮忙。

尝试遵循本指南here。指南here的源代码。

Here is a CodeSandBox of my issue.

最后是 CodeSandBox 中重要部分的代码 sn-p:

getRowRender( index, style ) 
    const item = this.state.items[index];

    return (
      <Draggable draggableId=item.id index=index key=item.id>
        (provided, snapshot) => (
          <div
            ref=provided.innerRef
            ...provided.draggableProps
            ...provided.dragHandleProps
            style=getItemStyle(
              snapshot.isDragging,
              provided.draggableProps.style
            )
          >
            item.content
          </div>
        )
      </Draggable>
    );
  


 render() 
    if (this.state.items)       
      return (
        <DragDropContext onDragEnd=this.onDragEnd>
          <Droppable
            droppableId="droppable"
            mode="virtual"
            renderClone=(provided, snapshot, rubric) => (
              <div
                ref=provided.innerRef
                ...provided.draggableProps
                ...provided.dragHandleProps
                style=getItemStyle(
                  snapshot.isDragging,
                  provided.draggableProps.style
                )
              >
                this.state.items[rubric.source.index].content
              </div>
            )
          >
            (provided, snapshot) => (
              <AutoSizer>
                ( height, width ) => (
                  <List
                    ...provided.droppableProps
                    height=height
                    rowCount=this.state.items.length
                    rowHeight=500
                    width=width
                    ref=(ref) => 
                      // react-virtualized has no way to get the list's ref that I can so
                      // So we use the `ReactDOM.findDOMNode(ref)` escape hatch to get the ref
                      if (ref) 
                        // eslint-disable-next-line react/no-find-dom-node
                        const whatHasMyLifeComeTo = ReactDOM.findDOMNode(ref);
                        if (whatHasMyLifeComeTo instanceof htmlElement) 
                          provided.innerRef(whatHasMyLifeComeTo);
                        
                      
                    
                    style=getListStyle(snapshot.isDraggingOver)
                    rowRenderer=this.getRowRender
                  />
                )
              </AutoSizer>
            )
          </Droppable>
        </DragDropContext>
      );
     else 
      return null;
    
  

【问题讨论】:

【参考方案1】:

我想我设法解决了这个问题。

https://codesandbox.io/s/vertical-list-forked-risye

您没有在 rowRenderer 中传递样式属性来以正确的方式虚拟化处理您的行。

你的 Autosizer 也没有增长到 height: 0 因为它的父级没有任何样式。

【讨论】:

我暂时离开了这个,因为我有一个截止日期,但@Kira 如果我能给你更多积分,我会的!演示看起来很棒,我很可能会在未来回到这个。我真的认为这应该可以帮助任何在谷歌上搜索并尝试完成同样事情的人.. 这并不容易! @Person 此密码框丢失,请修复。 嘿,你能修复一下代码框吗? 我没有沙箱了,原来的沙箱也没有为我打开。基本上 getRowRender 有 style 参数,你需要将它传递给 div 里面的 style 属性。 style=getItemStyle(...style, snapshot.isDragging, provided.draggableProps.style ) 我想有点像这样。

以上是关于无法让 React-Beautiful-DND 和 React-Virtualized 一起工作的主要内容,如果未能解决你的问题,请参考以下文章

使用 React-Beautiful-DND 拖动时,可拖动 div 给出 100% 的父级

更改 react-beautiful-dnd 可拖动点击区域

使用 react-beautiful-dnd 嵌套拖放

Dragabbale 不会在 react-beautiful-dnd 中移动

react-beautiful-dnd:当存在多个列表时,在一行中拖动内容会从所有行中拖动相同的索引

TypeError:无法读取React BeatifulDnD上未定义的属性'map'