javascript - 如何在 React 中拖放多个元素?

标签 javascript reactjs drag-and-drop

这是我在 StackOverflow 上的第一个问题。我想用 React 构建一个小游戏,用户可以在其中将四联骨牌拖放到网格上,还可以根据自己的喜好重新定位或旋转它们。 tetrominos 由一个矩阵表示,然后每个 block 都在 li 元素中呈现。

z-tetromino 示例: [0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0]

很遗憾,我还不能发布图片,这会让事情变得更容易。

网格过于用矩阵表示。

现在我要做的基本上是将这些 block 矩阵拖放到网格上,以便网格中的值相应地发生变化(0 → 1 等)。

问题是,我不知道如何使用标准 HTML5 DnD API 或 React DnD 一次拖动多个 li 元素。当用户点击某个四联骨牌的一个 li 元素时,整 block 应该移动。也许我可以使用 jQuery UI 解决这个问题,但由于在 React 中不允许直接 DOM 操作,所以我想知道如何去做。

我尝试将一个 block 拖到网格上,结果半最佳,因为一个 block 代替了一整行网格 block ,即使在 CSS 中设置了 display: inline-block。

这是第一个实验的一些简单代码。

onDragStart = e => {
    e.dataTransfer.effectAllowed = 'move';
    e.dataTransfer.setData('text', e.target.id);
    // e.dataTransfer.setDragImage(e.target.parentNode, 20, 20);
  };

  handleDrop = e => {
    const pieceOrder = e.dataTransfer.getData('text');
    // console.log(document.getElementById(pieceOrder));
    // e.target.appendChild(document.getElementById(pieceOrder));
    // console.log(pieceOrder);
    e.target.replaceWith(document.getElementById(pieceOrder));
    e.target.remove();
  };

renderEmptyBoardCell(i) {
    return (
      <li key={i} className="emptyBoardCell" onDragOver={(e) => e.preventDefault()} onDrop={(e) => this.handleDrop(e)}>></li>
    );
  }

  renderTemplateBoardCell(i) {
    return (
      <li key={i} className="templateBoardCell" onDragOver={(e) => e.preventDefault()} onDrop={(e) => this.handleDrop(e)}>></li>
    );
  }

  renderEmptyCell(i) {
    return (
      <li key={i} className="emptyCell"></li>
    );
  }

  renderFilledCell(piece_config, i) {
    return (
      <li key={i} id={i} className={`filledCell ${piece_config}`} draggable onDragStart={this.onDragStart}></li>
    );
  }

所以问题是,React DnD 或任何其他库在理论上是否可行?如果是,一次 DnD 多个元素的近似解决方案是什么。

感谢您的宝贵时间!

最佳答案

如果有人在 2020 年寻找解决方案。这是我的 current solution使用 react-dnd 和 react 钩子(Hook)。您可以尝试现场演示 here .

这是另一个更简单的例子,你可以查看codesandbox here .

关于javascript - 如何在 React 中拖放多个元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55750718/

相关文章:

javascript - 如何以动态方式控制带有悬停(显示和隐藏)的元素

javascript - 将项目放在可排序区域上时如何删除可排序区域的文本?

javascript - 如何将图像拖到 "trash can"并删除该单个图像

javascript - 无法在 D3 中为 svg 元素着色

javascript - 我的 .ts 代码中显示错误 > [ts] 类型 'name' 上不存在属性 'any[]'

javascript - 如何将一个数组中的连续值插入到另一个映射数组中?

javascript - 多次使用 ref React hooks

javascript - 使用 HTML5 拖放,有没有办法在保持拖动流的同时从 View 中隐藏元素

javascript - 内容编辑后如何更改单元格背景?

javascript - GWT + Google 可视化 API = Firefox 插件