当前位置: 首页 > 科技观察

这个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
);};exportdefaultTargetBox;2.3监听细节useDrag和useDrop上挂载了很多选项,其中很多选项都有一个监听对象,很多方法都挂载在这个对象上。下面简单介绍一下几种主要的方法,如下:1.显示器上拖拽的方法2.显示器上拖放方法3上面是拖拽前的效果图,拖拽拖拽,拖拽内容如下鼠标移动。拖着拖着,松开鼠标后,打印出一些内容,打印出来的结果先在drop中输出。然后在end中输出内容,所以我们要进行一些处理,最后在SourceBox中进行处理。如果在drop中修改了React相关的数据,会报错。4.学习和理解这个库的资料都是一样的,在使用的过程中遇到了一些坑。接下来就把这几个坑分享给各位老手,防止以后掉进去。end方法的调用时机晚于drop方法的调用时机,所以只有end处理释放的数据才能保证系统的正确性。如果在drop中更新了state或者Reactredux中的数据,会导致错误;item数据是Drag到Drop的桥梁,drag中定义的item数据可以通过monitor.getItem()获取;drop回调的返回值是Drop到Drag的桥梁,在end中可以通过monitor.getDropResult()获取其返回值;monitor上挂载的一些位置函数不一定适用于所有场景,需要引入DOM相关的位置操作。本文转载自微信公众号“前点线面”,可通过以下二维码关注。转载本文请联系前端点线面公众号。