第二、简单使用 \n2.1 安装 npm install react-dnd -S // react-dnd包,核心库 npm install react-dnd-html5-backend -S // 拖放的基础实现库
\n2.2 三个关键要点使用React DnD库,我认为最实用的部分是包含一个组件和两个Hook API。它们分别是:DndProvider元件 useDrag功能 useDrop功能
2.2.1 DndProvider元件
若要让某一内容具备React DnD的功能,必须使用DndProvider进行封装,其参数如下:
后端:必须。一个用React实现的后端。React DnD框架中的后端。目前官方文档提供了三种选择,分别是:react-dnd-html5-backend、react-dnd-touch-backend、react-dnd-test-backend,但最常使用的是react-dnd-html5-backend。 context:可选的。用于配置后端的后端上下文。这由后端来决定。 个选择:可供选择的。用来设置后端的选项对象。这要看后端是如何实现的。以下是组件的简单使用示例:\n```javascript\nimport { DndProvider } from 'react-dnd';\nimport { HTML5Backend } from 'react-dnd-html5-backend';\nfunction App(){\n return (\n让我们一起来看看useDrag部分的使用方法吧!
\n从'react-dnd'中导入 useDrag 。\n定义SourceBox组件并传入 props 参数: const SourceBox = (props) => { \n{childre 变量存储在 rops}中; \n/** \n返回的参数: \ncollected是一个对象,包含从collect函数中收集的属性,若collect函数未定义,返回空对象:如果需要,可以添加拖动器连接功能到DOM的可拖动部分;dragPreview:添加拖动预览功能至DOM的预览部分;常量[collected,drag, dragPreview] = useDrag({ // 只有与drop相同才可放置 type: 'box', // 描述拖动的数据类型 item: { detail: '我是可拖动的数据!!!!拖动结束后,将会触发调用end方法,参数有(item, monitor) => { // 获取释放后的结果 console.log('monitor.getDropResult():', monitor.getDropResult()); }monitor.getDropResult() // 源是否已经在目标处释放 console.log('monitor.didDrop()', monitor.didDrop()); // 指示当前是否允许拖放。默认情况下允许拖动功能。 监听器=>{{return true;}}, // 监听功能,采集:(monitor, props) => { return { isDragging: monitor.isDragging() }; } }); return ( <div ref={drag}> {childre </div> ); }; 输出 default SourceBox;
2.2.3 使用useDrop函数
以便将内容放置到目标位置,提供了useDrop函数,代码如下所示:
参数
如下所示:
1) spec:创建规范对象或函数,具体如下:
BOB半岛入口
1)accept为必填项,一个字符串,放置目标只对指定类型的拖动源产生的项目作出反应;
2)options
为可选项,一个普通对象;
3)drop(item,monitor)
为可选项,当兼容项目放在目标时被调用;
4)hover(item,monitor)
为可选项,在悬停在组件时调用项目;\n可选,用于指定放置目标是否接受该拖拽内容;\n可选,监听功能,并返回结果;\n返回值为数组,包含以下内容:\ncollected:收集的属性对象,如果未定义,则为空对象;\ndrop:用于放置目标的连接器函数,需附加到DOM的放置部分;\n通过ref属性进行连接。让我们一起来看看useDrop部分的使用,导入useDrop模块自"react-dnd";\nconst TargetBox = () => {\n const [collected, drop] = useDrop({\n // 此放置目标将仅对于指定类型的拖动源产生的项目作出反应\n accept: 'box',在这种情况下,项目需具有兼容性。当把物品(item, monitor)放到目标时调用drop方法 => console.log('我已经被放到目标!') !!你好, 这是我修改过的文本: "{} {}". // 监视功能 收集: 监视器 => { 返回 { // 检查是否叠加 是否叠加: monitor.isOver(),可以将文本改写为: // 是否允许投放 canDrop: monitor.canDrop(), item: monitor.getItem(),当调用monitor.didDrop()方法时,检测是否放置了元素。返回值为true代表已经放置。使用
四、在学习过程中我对
这一资源有了一些心得体会。虽然资料都大同小异,但在实际运用中,我碰到了一些困难。接下来我将和大家分享这些经验,以防大家也掉进同样的陷阱。end方法的调用时间晚于drop方法,因此只有在end方法中释放数据后进行处理才能确保系统的正确性。如果在drop方法中更新state或者在React Redux中更新数据,将会引发错误;item数据是drag和drop之间的连接,可以通过monitor.getItem()方法获取;drop回调的返回值是drag和drop之间的桥梁,可以通过monitor.getDropResult()方法获取其返回值;有些挂载在monitor上的位置函数并非所有场景都适用。需要使用DOM来执行位置相关的操作。本文来自微信公众号“前端点线面”,可扫描以下二维码关注。本文内容来自微信公众号“前端点线面”,可以使用下方二维码进行关注。如需转载本文,请联系前端点线面公众号。
BOB半岛下载
BOB半岛娱乐
BOB半岛APP
BOB半岛平台
BOB半岛新版