javascript - 使用 HOC 可拖动元素反应 DnD 引发无法设置未定义错误的属性“道具”
问题描述
我正在尝试将 React DnD 与许多不同的可拖动元素(不同的形状等)一起使用。它们基本上都相同并且具有相同的行为,所以我认为使用 HOC 是一个好主意。
我有以下 HOC,它是通过 React DnD 的可拖动组件:
import React, { Component } from "react";
import { DragSource } from "react-dnd";
// Components
import ItemTypes from "./ItemTypes";
/**
* Implements the drag source contract.
*/
const itemSource = {
beginDrag(props) {
return {};
}
};
/**
* Specifies the props to inject into your component.
*/
function collect(connect, monitor) {
return {
connectDragSource: connect.dragSource(),
isDragging: monitor.isDragging()
};
}
const DragItem = WrappedComponent => {
return class extends Component {
render() {
const { isDragging, connectDragSource } = this.props;
return connectDragSource(<WrappedComponent isDragging={isDragging} {...this.props} />);
}
};
};
export default DragSource(ItemTypes.BOX, itemSource, collect)(DragItem);
然后我有了应该实现可拖动 HOC 的基本元素:
import React, { Component } from "react";
import DragItem from "../DragItem";
class Box extends Component {
render() {
return (
<div
style={{
height: "50px",
width: "50px",
background: "red"
}}
/>
);
}
}
export default DragItem(Box);
这是将它们联系在一起的 DnD 上下文:
import React, { Component } from "react";
import { DragDropContext } from "react-dnd";
import HTML5Backend from "react-dnd-html5-backend";
// Components
import DropContainer from "./dragNDropUploader/DropContainer";
import Box from "./dragNDropUploader/types/Box";
class UploadTest extends Component {
render() {
return (
<div className="body_container padded_top padded_bottom">
<DropContainer />
<Box />
</div>
);
}
}
export default DragDropContext(HTML5Backend)(UploadTest);
我在开发工具控制台中得到以下信息:react.development.js:233 Uncaught TypeError: Cannot set property 'props' of undefined
我不完全确定我做错了什么。如果我从DragItem
HOC 中删除 DnD 的东西,事情会按预期显示(当然不能拖动)。但是,如果我尝试像我一样实施 DnD,它就会崩溃并死掉。
请教我:)
解决方案
这就是我定义render()
可拖动组件的方式...
return (
<div
onClick={(e) => this.handleClick(e)}
onDragStart={(e) => this.handleDragStart(e)}
onDrop={(e) => this.handleDragDrop(e)}
onDragEnter={(e) => this.handleDragEnter(e)}
onDragOver={(e) => this.handleDragOver(e)}
onDragLeave={(e) => this.handleDragLeave(e)}
draggable={true}
>Draggable Div</div>
);
对于所有这些的 ReactJS 处理程序,有这个:
handleDragEnter(e) {
e.preventDefault();
e.stopPropagation();
return false;
}
处理程序除外handleDragStart(e)
,它不会取消事件或返回 false。您可以在任何处理程序中放置您想要的任何类型的逻辑。
这种“矫枉过正”很大程度上是因为各种浏览器如何处理拖放,例如,如果你在 Chrome 中将元素 A 拖到元素 B 上,可能不会发生任何事情,但在 Firefox 中,它会尝试打开元素 A,就好像它是文件。
我在 npm 等尝试过的包有一半以上根本不起作用。必须将 NPM 包视为下载了 SourceForge 项目——几乎 100% 保证所有功能都能完美运行。所以,我不确定你下载的特定 HOC 有什么问题,但我希望这 10 行代码和你发布的 3 页一样容易理解。
推荐阅读
- mysql - 带有连接的 MYSQL 子查询
- php - PHP设置Basic Authentication Header服务器端
- c# - WCF 附加到 Visual Studio 中的进程
- sorting - XSLT 中的排序/重新排列
- python - AttributeError:生成器对象没有属性“排序”
- java - 将图像存储在服务器的数据库中
- sql - 在表sql中查找不同用户的记录数
- sql - 如何订购正确的方法以在单个结果集中包含多个组?
- c - C 中用于将 8 字节唯一 ID 缩短为 4 字节的散列函数
- android - 如何在 Android Oreo (8.1) 或更高版本中从 URI 获取文件路径