需求:需要把左侧的数据表,拖拽到右侧的表关联区域

左侧数据表HTML:

  1. <h3 class="data-block">数据表</h3>
  2. <a-input-search placeholder="输入关键词搜索" @search="handleSearchTable" style="width: 90%;" />
  3. <p style="margin-top: 10px;">
  4. <ul class="data-table-list">
  5. <li
  6. v-for="(item, index) in dataTableFilterResult"
  7. :key="index"
  8. draggable="true"
  9. @dragstart="onDragstartTable($event, item)"
  10. @dragend="onDragendTable($event)"
  11. >
  12. {{ item }}
  13. </li>
  14. </ul>
  15. </p>

关键在于需要在允许拖拽的元素上设置draggable属性为true,表示允许拖拽,然后定义两个事件,dragstart和dragend,用于处理拖拽事件。

dragstart事件是拖拽开始时触发,用于在拖拽时将数据存储到事件的dataTransfer数据容器中。

dragend事件是拖拽结束后触发,不管是否拖拽成功(可以理解为不管是否已经拖拽到目标区域)。

  1. // 拖拽开始
  2. onDragstartTable (event, item) {
  3. // console.log('------dragstart------')
  4. if (this.browserType().name === 'FF') {
  5. // 兼容火狐浏览器,火狐拖拽必须携带数据
  6. event.dataTransfer.setData('tableName', item)
  7. }
  8. // 指示拖拽的目标区域
  9. this.$refs.tableRelationArea.style.border = '2px red dashed'
  10. // 存储拖拽传输的数据
  11. event.dataTransfer.setData('tableName', item)
  12. console.log('drag tableName', item)
  13. },
  14. // 拖拽结束后触发,不管是否拖拽成功
  15. onDragendTable (event) {
  16. // console.log('------dragend------')
  17. // 隐藏拖拽目标区域指示
  18. this.$refs.tableRelationArea.style.border = '1px #d2cfcf45 solid'
  19. },

最后设置拖拽的目标区域,HTML如下:

  1. <div style="min-height: 200px; margin-bottom: 10px;">
  2. <div>
  3. <h3 class="data-block" style="display: inline-block;">表关联</h3>
  4. <a-popconfirm :title="`确定清空所有数据表关联吗?`" @confirm="handleClearTableConnect">
  5. <a style="display: inline-block; margin-left: 10px;">清空关联</a>
  6. </a-popconfirm>
  7. </div>
  8. <div
  9. ref="tableRelationArea"
  10. @dragover.prevent
  11. @drop.prevent="onDropTable"
  12. style="height: 150px; border: 1px #d2cfcf45 solid; overflow-y: auto;"
  13. >
  14. <a-tree
  15. v-if="tableRelationData.mainTable !== ''"
  16. ref="folderTree"
  17. :treeData="tableTreeData"
  18. :expandedKeys="tableConnectExpandedKeys"
  19. :selectedKeys="tableConnectSelectedKeys"
  20. :autoExpandParent="tableConnectAutoExpandParent"
  21. showLine
  22. show-icon
  23. @expand="onFolderTreeExpand"
  24. @select="onFolderTreeSelect">
  25. <a-icon slot="switcherIcon" type="down" />
  26. <!-- <a-icon slot="folder" type="folder" /> -->
  27. </a-tree>
  28. <a-empty v-else description="请将左侧表拖放至此" style="position: relative; top: 50%; transform: translateY(-50%);"></a-empty>
  29. </div>
  30. </div>

关键在于定义dragover和drop两个方法,dragover事件无需处理逻辑,但需要设置阻止冒泡,即:dragover.prevent,drop事件也需要设置阻止冒泡。

drop事件是松开鼠标完成拖拽后触发,用于获取拖拽时传输的数据,然后对数据进行处理,JS如下:

  1. // 松开鼠标完成拖拽后触发
  2. onDropTable (event, target) {
  3. // console.log('------drop------')
  4. // 获取拖拽携带的数据
  5. const tableName = event.dataTransfer.getData('tableName')
  6. console.log('drop tableName', tableName)
  7. // 渲染数据
  8. this.renderData(tableName)
  9. },

完整的效果:

完整的代码:

  1. <h3 class="data-block">数据表</h3>
  2. <a-input-search placeholder="输入关键词搜索" @search="handleSearchTable" style="width: 90%;" />
  3. <p style="margin-top: 10px;">
  4. <ul class="data-table-list">
  5. <li
  6. v-for="(item, index) in dataTableFilterResult"
  7. :key="index"
  8. draggable="true"
  9. @dragstart="onDragstartTable($event, item)"
  10. @dragend="onDragendTable($event)"
  11. >
  12. {{ item }}
  13. </li>
  14. </ul>
  15. </p>
  16.  
  17. <div style="min-height: 200px; margin-bottom: 10px;">
  18. <div>
  19. <h3 class="data-block" style="display: inline-block;">表关联</h3>
  20. <a-popconfirm :title="`确定清空所有数据表关联吗?`" @confirm="handleClearTableConnect">
  21. <a style="display: inline-block; margin-left: 10px;">清空关联</a>
  22. </a-popconfirm>
  23. </div>
  24. <div
  25. ref="tableRelationArea"
  26. @dragover.prevent
  27. @drop.prevent="onDropTable"
  28. style="height: 150px; border: 1px #d2cfcf45 solid; overflow-y: auto;"
  29. >
  30. <a-tree
  31. v-if="tableRelationData.mainTable !== ''"
  32. ref="folderTree"
  33. :treeData="tableTreeData"
  34. :expandedKeys="tableConnectExpandedKeys"
  35. :selectedKeys="tableConnectSelectedKeys"
  36. :autoExpandParent="tableConnectAutoExpandParent"
  37. showLine
  38. show-icon
  39. @expand="onFolderTreeExpand"
  40. @select="onFolderTreeSelect">
  41. <a-icon slot="switcherIcon" type="down" />
  42. <!-- <a-icon slot="folder" type="folder" /> -->
  43. </a-tree>
  44. <a-empty v-else description="请将左侧表拖放至此" style="position: relative; top: 50%; transform: translateY(-50%);"></a-empty>
  45. </div>
  46. </div>
  1. // 拖拽开始
  2. onDragstartTable (event, item) {
  3. // console.log('------dragstart------')
  4. if (this.browserType().name === 'FF') {
  5. // 兼容火狐浏览器,火狐拖拽必须携带数据
  6. event.dataTransfer.setData('tableName', item)
  7. }
  8. // 指示拖拽的目标区域
  9. this.$refs.tableRelationArea.style.border = '2px red dashed'
  10. // 存储拖拽传输的数据
  11. event.dataTransfer.setData('tableName', item)
  12. console.log('drag tableName', item)
  13. },
  14. // 拖拽结束后触发,不管是否拖拽成功
  15. onDragendTable (event) {
  16. // console.log('------dragend------')
  17. // 隐藏拖拽目标区域指示
  18. this.$refs.tableRelationArea.style.border = '1px #d2cfcf45 solid'
  19. },
  20. // 松开鼠标完成拖拽后触发
  21. onDropTable (event, target) {
  22. // console.log('------drop------')
  23. // 获取拖拽携带的数据
  24. const tableName = event.dataTransfer.getData('tableName')
  25. console.log('drop tableName', tableName)
  26. // 渲染数据
  27. this.renderData(tableName)
  28. },

Vue H5拖拽实例的更多相关文章

  1. H5 拖拽读取文件和文件夹

    1)拖拽方面的重点是:ondragover 事件 和 ondrop 事件 ondragover 是必须的,ondragover 事件里禁用掉 html 的默认事件,否则 ondrop 事件将无效(直接 ...

  2. H5拖拽 构造拖拽及缩放 pdf展示

    前言: 协助项目需要实现一个签名的功能. 功能说明:1.有文本签名和头像签名.2.头像签名需要实现可拖拽功能.3.需要展示的是pdf的文件并需要获取签名位于pdf文件的相对位置. 功能一:实现拖拽 思 ...

  3. H5拖拽 构造拖拽及缩放 pdf文件转换为html预览

    前言: 协助项目需要实现一个签名的功能. 功能说明:1.有文本签名和头像签名.2.头像签名需要实现可拖拽功能.3.需要展示的是pdf的文件并需要获取签名位于pdf文件的相对位置. 功能一:实现拖拽 思 ...

  4. 基于Vue实现拖拽效果

    参考地址:基于Vue实现拖拽效果 参考链接中讲的比较详细,我只使用了其中自定义指令的方法.整体代码如下: <template> <!-- 卡片 --> <div clas ...

  5. H5 拖拽操作

    H5 拖拽操作 前言 在原生H5中,可以通过提供的api实现在网页内元素的拖拽操作.相对于传统的写法更加的简单. 而想要实现拖拽,主要需要进行两个方面的工作,第一是给元素设置draggable='tr ...

  6. Vue 可拖拽组件 Vue Smooth DnD 详解和应用演示

    本文发布自 https://www.cnblogs.com/wenruo/p/15061907.html 转载请注明出处. 简介和 Demo 展示 最近需要有个拖拽列表的需求,发现一个简单好用的 Vu ...

  7. vue内容拖拽放大缩小

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. 仿h5拖拽

    在h5中有个拖拽的声明式命令,就如html属性一样,简单强大. 而在网页上拖拽的功能还是需求很大的,所以对这方面应该去仔细了解一下. 所以仿一一下它的实现.只是仿了它的复制一份到目标容器的功能.它还有 ...

  9. h5拖拽上传图片

    h5实现拖拽上传图片 本文将为大家介绍如何通过js实现拖拽上传图片. 首先我们要禁用调浏览器默认的拖拽事件: window.onload = function(){ //拖离 document.add ...

随机推荐

  1. Python globals和locals函数_reload函数

    Python globals和locals函数_reload函数: globals( ): 返回所有能够访问到的全局名字 num = 5 sum = 0 def add(num): func_sum ...

  2. Linux系统的基本操作

    20200727 Linux目录结构 基本介绍 Linux的文件系统是采用层级式的树状结构,在此结构中的最上层是/根目录 tip1:在Linux世界里,一切皆是文件 示例 /bin: bin是Bina ...

  3. PHP unixtojd() 函数

    ------------恢复内容开始------------ 实例 把 Unix 时间戳转换为儒略日计数: <?phpecho unixtojd();?> 运行实例 » 定义和用法 uni ...

  4. SpringBoot2 整合 Swagger2文档 使用BootstrapUI页面

    SpringBoot2 整合 Swagger2 SpringBoot整合三板斧 第一步.引入pom <dependency> <groupId>com.spring4all&l ...

  5. log4j2 自动删除过期日志文件配置及实现原理解析

    日志文件自动删除功能必不可少,当然你可以让运维去做这事,只是这不地道.而日志组件是一个必备组件,让其多做一件删除的工作,无可厚非.本文就来探讨下 log4j 的日志文件自动删除实现吧. 0. 自动删除 ...

  6. Kaggle-pandas(6)

    Renaming-and-combining 教程 通常,数据会以列名,索引名或我们不满意的其他命名约定提供给我们. 在这种情况下,您将学习如何使用pandas函数将有问题的条目的名称更改为更好的名称 ...

  7. CSS学习第三天

    定位布局: 相对定位:相对于自身的位置进行偏移position需要搭配left right top bottom      position: relative; 绝对定位:相对于有position属 ...

  8. 基于小程序云Serverless开发微信小程序

    本文主要以使用小程序云Serverless服务开发一个记事本微信小程序为例介绍如何使用小程序云Serverless开发微信小程序.记事本小程序的开发涉及到云函数调用.云数据库存储.图片存储等功能,较好 ...

  9. 最后之作-Last Order(bushi

    最近化学学有机选修,讲羧酸的时候我想到一个问题:不考虑空间异构.能否稳定存在等问题,某高级饱和脂肪酸有多少种同分异构体?做为一名退役的OIer,我将它抽象为了另一个问题:含\(n\)个\(C\)的饱和 ...

  10. Android 本地缓存Acache的简单使用

    设置缓存数据: ACache mCache = ACache.get(this); mCache.put("key1", "value"); //保存6秒,如果 ...