文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

这个 Star 的拖拽库有点料,我们一起学学

2024-12-02 10:21

关注

二、简单使用

2.1 安装

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

2.2 三个核心点

通过使用React DnD这个库,我认为里面最有用的部分包含一个组件和两个Hook API,它们分别是:

2.2.1 DndProvider组件

如果想让某一内容使用React DnD的能力,需要将该部分用DndProvider进行包裹,其接收参数如下所示:

下面来一起看看该组件的简单使用:

  1. import {DndProvider} from 'react-dnd'
  2. import {HTML5Backend} from 'react-dnd-html5-backend'
  3.  
  4. function App() { 
  5.   return ( 
  6.     "App"
  7.        
  8.         此处将放拖拽相关内容 
  9.        
  10.     
 
  •   ); 
  •  
  • export default App; 
  • 2.2.2 useDrag函数

    既然知道了整个操纵空间,接下来需要了解的就是从什么位置进行拖拽,该库提供了useDrag hook API,该元素可以让一个DOM元素实现拖拽效果。

    参数

    (1) spec:创建规范对象的规范对象或函数,其详细内容如下所示:

    1)type

    必须,是一个字符串或Symbol,只有drop和此值相同才可以进行放置;

    2)item

    必须,用于描述被拖动的数据

    3)previewOptions

    可选的,一个简单对象,用于描述拖动预览选项;

    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部分的使用

    1. import {useDrag} from 'react-dnd'
    2.  
    3. const SourceBox = props => { 
    4.     const {children} = props; 
    5.  
    6.      
    7.     const [collected, drag, dragPreview] = useDrag({ 
    8.         // 只有drop和此值相同才可以进行放置 
    9.         type: 'box'
    10.         // 描述要拖动的数据 
    11.         item: { 
    12.             detail: '我是可以拖动的数据!!!' 
    13.         }, 
    14.         // 拖动停止的手end将会被调用 
    15.         end: (item, monitor) => { 
    16.             // getDropResult()获取释放后的结果 
    17.             console.log('monitor.getDropResult():', monitor.getDropResult()); 
    18.             // source是否已经drop在target 
    19.             console.log('monitor.didDrop()', monitor.didDrop()); 
    20.         }, 
    21.         // 指定当前是否允许拖动,默认允许 
    22.         canDrag: monitor => { 
    23.             return true
    24.         }, 
    25.         // 监听功能 
    26.         collect: (monitor, props) => { 
    27.             return { 
    28.                 isDragging: monitor.isDragging() 
    29.             }; 
    30.         } 
    31.     }); 
    32.     return ( 
    33.          
    34.             {children} 
    35.         
     
  •     ); 
  • }; 
  •  
  • export default SourceBox; 
  • 2.2.3 useDrop函数

    为了将内容放置到目标位置,提供了useDrop函数,如下所示:

    参数

    (1) spec:创建规范对象的规范对象或函数,其详细内容如下所示:

    1)accept

    必须,一个字符串,此放置目标将仅对于指定类型的拖动源产生的项目作出反应;

    2)options

    可选的,一个普通的对象;

    3)drop(item,monitor)

    可选的,当兼容项目放在目标时被调用;

    4)hover(item,monitor)

    可选的,将项目悬停在组件时调用;

    5)canDrop(item,monitor)

    可选的,用它来指定放置目标是否接受该拖拽内容;

    6)collect

    可选的,监听功能

    返回值

    返回值是一个数组,数组内容分别为:

    collected:一个对象,包含从collect函数收集的属性,如果collect未定义函数,则返回一个空对象;drop:一个用于放置目标的连接器函数,必须附加到DOM的放置部分;

    与放置部分建立连接

    通过ref属性,将drop与放置部分建立连接。

    下面一起来看看useDrop部分的使用

    1. import {useDrop} from "react-dnd"
    2.  
    3. const TargetBox = () => { 
    4.     const [collected, drop] = useDrop({ 
    5.         //  此放置目标将仅对于指定类型的拖动源产生的项目作出反应 
    6.         accept: 'box'
    7.         // 当兼容项目放在目标时调用 
    8.         drop: (item, monitor) => { 
    9.             console.log('我已经被放到目标!!!'
    10.         }, 
    11.         // 监听功能 
    12.         collect: monitor => { 
    13.             return { 
    14.                 // 是否重叠 
    15.                 isOver: monitor.isOver(), 
    16.                 // 是否可以放置 
    17.                 canDrop: monitor.canDrop(), 
    18.                 item: monitor.getItem(), 
    19.                 didDrop: monitor.didDrop() 
    20.             }; 
    21.         } 
    22.     }); 
    23.  
    24.     return ( 
    25.         drop}> 
    26.             "targetBox"
    27.                 这是放置的区块 
    28.              
    29.          
    30.     ); 
    31. }; 
    32.  
    33. export default TargetBox; 

    2.3 monitor详细内容

    useDrag和useDrop上挂载了很多选项,这些选项中很多存在monitor对象,该对象上挂载了很多方法,下面就简要概述几个主要方法,如下所示:

    drag上的monitor上的方法

    drop上的monitor上的方法

    三、效果图

    拖拽前

    拖拽中

    拖拽中拖拽的内容跟随鼠标移动

    拖拽后

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

    四、学习感悟

    这个库的资料千篇一律,在使用过程中遇到了一些坑,接下来与各位老铁分享一下这些坑,防止后续深陷其中。

     

    本文转载自微信公众号「前端点线面」,可以通过以下二维码关注。转载本文请联系前端点线面公众号。

     

    来源:前端点线面内容投诉

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    软考中级精品资料免费领

    • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

      难度     813人已做
      查看
    • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

      难度     354人已做
      查看
    • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

      难度     318人已做
      查看
    • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

      难度     435人已做
      查看
    • 2024年上半年系统架构设计师考试综合知识真题

      难度     224人已做
      查看

    相关文章

    发现更多好内容

    猜你喜欢

    AI推送时光机
    位置:首页-资讯-后端开发
    咦!没有更多了?去看看其它编程学习网 内容吧
    首页课程
    资料下载
    问答资讯