这个Star的拖拽库有点意思,一起来学习
时间:2023-03-18 20:10:49
科技观察
一、背景最近工作中遇到一个新的需求。这个需求需要实现某个组件的拖拽。第一个面临这个需求的项目肯定是问过度娘,用最大的同性交友网站搜索。最终天上掉馅饼,找到了这个17kstar的React拖拽库——ReactDnD。2.简单使用2.1安装npminstallreact-dnd-S//react-dnd包,其核心包npminstallreact-dnd-html5-backend-S//拖拽底层实现所需的库2.2三个核心点使用ReactDnD这个库我觉得最有用的部分包含了一个组件和两个HookAPI,分别是:DndProvider组件useDrag函数useDrop函数2.2.1DndProvider组件如果你想让某个内容使用ReactDnD的能力,你需要添加这部分用DndProvider包裹起来,它的接收参数如下:backend:required。ReactDnD后端。目前官方文档有3个,分别是:react-dnd-html5-backend、react-dnd-touch-backend、react-dnd-test-backend,但常用的还是react-dnd-html5-backend。上下文:可选。用于配置后端的后端上下文。这取决于后端实现。选项:可选。用于配置后端的选项对象。这取决于后端实现。我们来看看这个组件的简单使用:import{DndProvider}from'react-dnd';import{HTML5Backend}from'react-dnd-html5-backend';functionApp(){return(拖放相关的内容会放在这里
);}exportdefaultApp;2.2.2现在useDrag函数知道了整个操作空间,接下来要做的知道从哪里开始拖放,该库提供了useDraghookAPI,可以让一个DOM元素实现拖放效果。参数(1)spec:规范对象或创建规范对象的函数。其详细说明如下:1)type必须是string或Symbol,drop只有和thisvalue有相同的值才能放置;2)itemmust,用于描述拖动的数据3)previewOptionsoptional,一个简单的对象,用于描述拖动预览选项;4)options可选,一个简单的对象5)end(item,monitor)可选,当拖动停止时,调用该函数;6)canDrag(monitor)是可选的,用它来指定当前是否允许拖动;7)isDragging(monitor)可选,默认情况下,只有启动拖动操作的拖动源才被视为拖动;8)collect是可选的,监听函数的返回值是一个数组。数组的内容是:collected:包含从collect函数收集的属性的对象。如果collect没有定义函数,则返回一个空对象;drag:拖动器的连接器函数,必须附加到DOM的可拖动部分;dragPreview:拖动预览的连接器函数,可以附加到DOM的预览部分;与拖动部分建立连接,通过ref属性将drag或dragPreview绑定到拖动源。下面看一下useDrag部分的使用来自collect的collected属性,如果collect没有定义函数,则返回一个空对象*drag:拖动器的连接器函数,必须附加到DOM的可拖动部分*dragPreview:拖动预览的连接器函数,whichcanbeattachedTothepreviewpartoftheDOM*/const[collected,drag,dragPreview]=useDrag({//只有drop并且可以放这个值type:'box',//描述要拖动的数据item:{detail:'我是可以拖动的数据!!!'},//拖动手端结束会调用end:(item,monitor)=>{//getDropResult()得到结果afterreleaseconsole.log('monitor.getDropResult():',monitor.getDropResult());//是否在targetconsole.log('monitor.didDrop()',monitor.didDrop());},//指定是否呃目前是允许Dragging的,默认canDrag:monitor=>{returntrue;},//监控函数collect:(monitor,props)=>{return{isDragging:monitor.isDragging()};}});return(
{children} );};exportdefaultSourceBox;2.2.3useDrop函数为了将内容放置在目标位置,提供了useDrop函数,如下:参数(1)spec:创建规范对象或函数的规范对象,其详细说明如下:1)accept必须是一个字符串,这个放置目标只会响应指定类型的拖动源生成的item;2)options是可选的,一个普通的对象;3)drop(item,monitor)可选,当兼容的项目被放置在目标上时调用;4)悬停(项目,莫nitor)可选,当项目悬停在组件上时调用;5)canDrop(item,monitor)可选,用它来指定放置目标是否接受拖动内容;6)collect可选,monitor函数返回Value返回值是一个数组,数组的内容是:collected:一个对象,包含从collect函数中收集到的属性。如果collect没有定义函数,则返回一个空对象;drop:用于放置目标的连接器函数,它必须附加到DOM的放置部分;establishingaconnectionwithdropsectionthroughtherefattribute,建立drop和dropsection之间的连接下面看一下useDrop部分的使用sourcereactacceptproducedofdragItems指定类型accept:'box',//当兼容的物品被拖放到目标上时调用drop:(item,monitor)=>{console.log('我已经被拖放到目标上了!!!')},//监控函数collect:monitor=>{return{//是否重叠isOver:monitor.isOver(),//canDrop是否可以放置:monitor.canDrop(),item:monitor.getItem(),didDrop:monitor.didDrop()};}});return(
Thisistheplacedblock