使用react-dnd使组件可拖动

时间:2020-05-10 15:09:03

标签: javascript reactjs react-dnd

我正在尝试使用react-dnd

拖动组件

我会试着像this example那样做,但只拖了一下。

在我的应用程序的所有组件之上,我导入react-dnd-html5-backend并包装我的应用程序:

import Backend from 'react-dnd-html5-backend'
import { DndProvider } from 'react-dnd'

render(
  <Provider store={store}>
    <FluentuiProvider theme={themes.teams}>
      <DndProvider backend={Backend}>
        <App theme={themes.teams} />
      </DndProvider>
    </FluentuiProvider>
  </Provider>,
  document.getElementById('root')
)

然后在我的组件中:

import { useDrag } from 'react-dnd';

export default ({ call, pauseCall, onHoldCalls, endCall, addNote }) => {
  const [collectedProps, drag] = useDrag({
     item: { type: 'Personna' },
  })
  return (
     <div className="personna">
        <Persona ref={drag} {...call.CALL_DETAILS.personInfos["formattedPersData"]} size={PersonaSize.size40} />
     </div>
  )
}

渲染组件时出现此错误

TypeError:node.setAttribute不是函数 在HTML5Backend.connectDragSource(HTML5Backend.js:487) 在SourceConnector.reconnectDragSource(SourceConnector.js:115)

我没有添加dragSource,因为在示例中没有使用它。

我不知道为什么收到此错误消息。

1 个答案:

答案 0 :(得分:1)

正如@Panther所说,ref应该放在HTML元素上,而不是React组件上:

return <div ref={drag}>{"Drag me!"}</div>;

或者,根据您的情况,可以将ref添加到<div className="personna">容器中:

return (
     <div ref={drag} className="personna">
        <Persona ....


为了帮助您了解最小拖动示例,请看一下这个非常小的设置:

应用 .js

import React from "react";
import Backend from "react-dnd-html5-backend";
import { DndProvider } from "react-dnd";
import { MyComponent } from "./MyComponent";
import "./styles.css";

export default function App() {
  return (
    <DndProvider backend={Backend}>
      <div className="App">
        <MyComponent />
      </div>
    </DndProvider>
  );
}

MyComponent .js

export default function App() {
  return (
    <DndProvider backend={Backend}>
      <div className="App">
        <MyComponent />
      </div>
    </DndProvider>
  );
}

Try it on codesandbox.io!