在嵌套的放置目标内放置组件时出现错误

时间:2019-04-13 09:20:10

标签: reactjs react-dnd

这是我的容器类

Code on Sandbox

`import React, { Component } from "react";
import { DropTarget } from "react-dnd";
import Box from "./Box";

class Container extends Component {
  state = {
    Boxes: [
      { left: 60, top: 30, text: "ITEM_1" },
      { left: 100, top: 70, text: "ITEM_2" }
    ]
  };
  render() {
    const { connectDropTarget } = this.props;
    return connectDropTarget(
      <div
        className="container"
        style={{ width: "100%", height: "100vh", background: "yellow" }}
      >
        {this.state.Boxes.map((box, index) => {
          return (
            <Box
              id={index}
              key={index}
              left={box.left}
              top={box.top}
              text={box.text}
              moveBox={this.moveBox}
            />
          );
        })}
      </div>
    );
  }
  moveBox(id, left, top) {
    const allBoxes = this.state.Boxes;
    const singleBox = this.state.Boxes[id];
    singleBox.left = left;
    singleBox.top = top;
    const newBox = allBoxes.filter((box, index) => index !== id);
    newBox.push(singleBox);
    this.setState({ Boxes: newBox });
  }
}

export default DropTarget(
  "items",
  {
    // Spec Object Started
    drop(props, monitor, component) {
      const item = monitor.getItem();
      const delta = monitor.getDifferenceFromInitialOffset();
      const left = Math.round(item.left + delta.x);
      const top = Math.round(item.top + delta.y);
      component.moveBox(item.id, left, top);
    }
  }, //Spec Oject Ended Here
  (connect, monitor) => ({
    connectDropTarget: connect.dropTarget()
  })
)(Container);
`

这是我的盒子课

import React, { Component } from "react";
import { DragSource, DropTarget } from "react-dnd";
import flow from "lodash/flow";
let whichDragging = "items";
class Box extends Component {
  state = {};
  render() {
    const { left, top, text, connectDragSouce, connectDropTarget } = this.props;
    return connectDragSouce(
      connectDropTarget(
        <div
          style={{
            width: "20%",
            border: "2px dotted black",
            margin: "auto",
            position: "relative",
            top: top,
            left: left
          }}
        >
          {text}
        </div>
      )
    );
  }
}

export default flow(
  DragSource(
    whichDragging,
    {
      beginDrag(props, monitor, component) {
        console.log(component);
        const { left, top, text, id } = props;
        return {
          left,
          top,
          text,
          id
        };
      }
    },
    (connect, monitor) => ({
      connectDragSouce: connect.dragSource()
    })
  ),
  DropTarget(
    whichDragging,
    {
      drop(props, monitor, component) {
        whichDragging = "nested";
        const item = monitor.getItem();
        const delta = monitor.getDifferenceFromInitialOffset();
        const left = Math.round(item.left + delta.x);
        const top = Math.round(item.top + delta.y);

        console.log("Logging");
        console.log(component);
        // whichDragging = "items";
      }
    },
    (connect, monitor) => ({
      connectDropTarget: connect.dropTarget()
    })
  )
)(Box);

简单的拖放操作可以正常工作,但是当我将item_1放在item_2上,反之亦然时,我遇到了错误,并且我的Component在drop中显示了console.log中的DragDropContainer,我想获取要放置一个组件的组件的id | key并且自2天以来找不到任何解决方案,我们将寻求任何帮助。

0 个答案:

没有答案