这个17k star的拖拽库有点料
2023-12-21 17:11:52 软件 246观看
摘要一、背景近期在工作中遇到了一个新的需求,该需求需要实现某个组件的拖拽,面对这个需求的第一个项目肯定是问问度娘和用最大同性交友网站进行搜索,最终皇天不负有心人,让我找到了这个17k star的React拖拽库——React DnD。

jcg28资讯网——每日最新资讯28at.com

一、背景

近期在工作中遇到了一个新的需求,该需求需要实现某个组件的拖拽,面对这个需求的第一个项目肯定是问问度娘和用最大同性交友网站进行搜索,最终皇天不负有心人,让我找到了这个17k star的React拖拽库——React DnD。jcg28资讯网——每日最新资讯28at.com

二、简单使用

1、安装

npm install react-dnd -S // react-dnd包,其核心包npm install react-dnd-html5-backend -S // 拖拽的底层实现所需要的库

2、三个核心点

通过使用React DnD这个库,我认为里面最有用的部分包含一个组件和两个Hook API,它们分别是:jcg28资讯网——每日最新资讯28at.com

  • DndProvider组件
  • useDrag函数
  • useDrop函数

(1)DndProvider组件

如果想让某一内容使用React DnD的能力,需要将该部分用DndProvider进行包裹,其接收参数如下所示:jcg28资讯网——每日最新资讯28at.com

  • backend:必填。一个React DnD后端。目前官方文档有三个,分别为:react-dnd-html5-backend、react-dnd-touch-backend、react-dnd-test-backend,但是常用的还是react-dnd-html5-backend。
  • context:可选的。用于配置后端的后端上下文。这取决于后端实现。
  • options:可选的。用于配置后端的选项对象。这取决于后端实现。

下面来一起看看该组件的简单使用:jcg28资讯网——每日最新资讯28at.com

import {DndProvider} from 'react-dnd';import {HTML5Backend} from 'react-dnd-html5-backend';function App() {  return (    <div className="App">      <DndProvider backend={HTML5Backend}>        此处将放拖拽相关内容      </DndProvider>    </div>  );}export default App;

(2)useDrag函数

既然知道了整个操纵空间,接下来需要了解的就是从什么位置进行拖拽,该库提供了useDrag hook API,该元素可以让一个DOM元素实现拖拽效果。jcg28资讯网——每日最新资讯28at.com

参数:jcg28资讯网——每日最新资讯28at.com

spec:创建规范对象的规范对象或函数,其详细内容如下所示:jcg28资讯网——每日最新资讯28at.com

type:jcg28资讯网——每日最新资讯28at.com

必须,是一个字符串或Symbol,只有drop和此值相同才可以进行放置;jcg28资讯网——每日最新资讯28at.com

item:jcg28资讯网——每日最新资讯28at.com

必须,用于描述被拖动的数据jcg28资讯网——每日最新资讯28at.com

previewOptions:jcg28资讯网——每日最新资讯28at.com

可选的,一个简单对象,用于描述拖动预览选项;jcg28资讯网——每日最新资讯28at.com

options:jcg28资讯网——每日最新资讯28at.com

可选的,一个简单对象jcg28资讯网——每日最新资讯28at.com

end(item, monitor):jcg28资讯网——每日最新资讯28at.com

可选的,当拖拽停止,该函数被调用;jcg28资讯网——每日最新资讯28at.com

canDrag(monitor):jcg28资讯网——每日最新资讯28at.com

可选的,使用它指定当前是否允许拖动;jcg28资讯网——每日最新资讯28at.com

isDragging(monitor):jcg28资讯网——每日最新资讯28at.com

可选的,默认情况下,只有启动拖动操作的拖动源才被视为拖动;jcg28资讯网——每日最新资讯28at.com

collect:jcg28资讯网——每日最新资讯28at.com

可选的,监听功能。jcg28资讯网——每日最新资讯28at.com

返回值:jcg28资讯网——每日最新资讯28at.com

返回值是一个数组,数组内容分别为:jcg28资讯网——每日最新资讯28at.com

collected:一个对象,包含从collect函数收集的属性,如果collect未定义函数,则返回一个空对象;drag:拖动器的连接器功能,必须附加到DOM的可拖动部分;dragPreview:用于拖动预览的连接器功能,可以附加到DOM的预览部分;jcg28资讯网——每日最新资讯28at.com

与拖动部分建立连接:jcg28资讯网——每日最新资讯28at.com

通过ref属性,将drag或dragPreview绑定到拖拽源上。jcg28资讯网——每日最新资讯28at.com

下面一起来看看useDrag部分的使用jcg28资讯网——每日最新资讯28at.com

import {useDrag} from 'react-dnd';const SourceBox = props => {    const {children} = props;    /**     * 返回的参数     * collected:一个对象,包含从collect函数收集的属性,如果collect未定义函数,则返回一个空对象     * drag:拖动器的连接器功能,必须附加到DOM的可拖动部分     * dragPreview:用于拖动预览的连接器功能,可以附加到DOM的预览部分     */    const [collected, drag, dragPreview] = useDrag({        // 只有drop和此值相同才可以进行放置        type: 'box',        // 描述要拖动的数据        item: {            detail: '我是可以拖动的数据!!!'        },        // 拖动停止的手end将会被调用        end: (item, monitor) => {            // getDropResult()获取释放后的结果            console.log('monitor.getDropResult():', monitor.getDropResult());            // source是否已经drop在target            console.log('monitor.didDrop()', monitor.didDrop());        },        // 指定当前是否允许拖动,默认允许        canDrag: monitor => {            return true;        },        // 监听功能        collect: (monitor, props) => {            return {                isDragging: monitor.isDragging()            };        }    });    return (        <div ref={drag}>            {children}        </div>    );};export default SourceBox;

(3)useDrop函数

为了将内容放置到目标位置,提供了useDrop函数,如下所示:jcg28资讯网——每日最新资讯28at.com

参数:jcg28资讯网——每日最新资讯28at.com

spec:创建规范对象的规范对象或函数,其详细内容如下所示:jcg28资讯网——每日最新资讯28at.com

accept:jcg28资讯网——每日最新资讯28at.com

必须,一个字符串,此放置目标将仅对于指定类型的拖动源产生的项目作出反应。jcg28资讯网——每日最新资讯28at.com

options:jcg28资讯网——每日最新资讯28at.com

可选的,一个普通的对象。jcg28资讯网——每日最新资讯28at.com

drop(item,monitor):jcg28资讯网——每日最新资讯28at.com

可选的,当兼容项目放在目标时被调用。jcg28资讯网——每日最新资讯28at.com

hover(item,monitor):jcg28资讯网——每日最新资讯28at.com

可选的,将项目悬停在组件时调用。jcg28资讯网——每日最新资讯28at.com

canDrop(item,monitor):jcg28资讯网——每日最新资讯28at.com

可选的,用它来指定放置目标是否接受该拖拽内容。jcg28资讯网——每日最新资讯28at.com

collect:jcg28资讯网——每日最新资讯28at.com

可选的,监听功能。jcg28资讯网——每日最新资讯28at.com

返回值:jcg28资讯网——每日最新资讯28at.com

返回值是一个数组,数组内容分别为:jcg28资讯网——每日最新资讯28at.com

collected:一个对象,包含从collect函数收集的属性,如果collect未定义函数,则返回一个空对象;drop:一个用于放置目标的连接器函数,必须附加到DOM的放置部分;jcg28资讯网——每日最新资讯28at.com

与放置部分建立连接:jcg28资讯网——每日最新资讯28at.com

通过ref属性,将drop与放置部分建立连接。jcg28资讯网——每日最新资讯28at.com

下面一起来看看useDrop部分的使用jcg28资讯网——每日最新资讯28at.com

import {useDrop} from "react-dnd";const TargetBox = () => {    const [collected, drop] = useDrop({        //  此放置目标将仅对于指定类型的拖动源产生的项目作出反应        accept: 'box',        // 当兼容项目放在目标时调用        drop: (item, monitor) => {            console.log('我已经被放到目标!!!')        },        // 监听功能        collect: monitor => {            return {                // 是否重叠                isOver: monitor.isOver(),                // 是否可以放置                canDrop: monitor.canDrop(),                item: monitor.getItem(),                didDrop: monitor.didDrop()            };        }    });    return (        <div ref={drop}>            <div className="targetBox">                这是放置的区块            </div>        </div>    );};export default TargetBox;

3、monitor详细内容

useDrag和useDrop上挂载了很多选项,这些选项中很多存在monitor对象,该对象上挂载了很多方法,下面就简要概述几个主要方法,如下所示:jcg28资讯网——每日最新资讯28at.com

drag上的monitor上的方法:jcg28资讯网——每日最新资讯28at.com

jcg28资讯网——每日最新资讯28at.com

drop上的monitor上的方法:jcg28资讯网——每日最新资讯28at.com

jcg28资讯网——每日最新资讯28at.com

三、效果图

拖拽前:jcg28资讯网——每日最新资讯28at.com

jcg28资讯网——每日最新资讯28at.com

拖拽中:jcg28资讯网——每日最新资讯28at.com

拖拽中拖拽的内容跟随鼠标移动。jcg28资讯网——每日最新资讯28at.com

jcg28资讯网——每日最新资讯28at.com

拖拽后:jcg28资讯网——每日最新资讯28at.com

拖拽释放鼠标后,一些内容被打印出来,打印的结果是先输出drop中的内容再输出end中的内容,所以我们想做一些处理最后在SourceBox中进行处理,如果在drop中改变React相关的数据会报错。jcg28资讯网——每日最新资讯28at.com

jcg28资讯网——每日最新资讯28at.com

四、学习感悟

这个库的资料千篇一律,在使用过程中遇到了一些坑,接下来与各位老铁分享一下这些坑,防止后续深陷其中。jcg28资讯网——每日最新资讯28at.com

  • end方法的调用时机晚于drop的调用时机,所以只有在end中做释放后的数据处理才能保证系统的正确性,如果在drop中就更新state或React redux中数据,会引发错误;
  • item数据是从Drag到Drop之间的桥梁,在drag中定义的item数据可以通过monitor.getItem()获取;
  • drop回调的返回值是从Drop到Drag之间的桥梁,在end中可以通过monitor.getDropResult()其返回值;
  • 一些挂载在monitor上的位置函数并不一定适用于所有的场景,需要引入DOM相关的位置操作。

本文链接:http://www.28at.com/showinfo-26-51254-0.html这个17k star的拖拽库有点料

声明:本网页内容旨在传播知识,不代表本站观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。

显示全文

上一篇:FileProvider共享文件和访问文件的内容提供者

下一篇:一文搞懂 Java8 reduce操作

最新热点