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

左侧数据表HTML:

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

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

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

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

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

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

<div style="min-height: 200px; margin-bottom: 10px;">
<div>
<h3 class="data-block" style="display: inline-block;">表关联</h3>
<a-popconfirm :title="`确定清空所有数据表关联吗?`" @confirm="handleClearTableConnect">
<a style="display: inline-block; margin-left: 10px;">清空关联</a>
</a-popconfirm>
</div>
<div
ref="tableRelationArea"
@dragover.prevent
@drop.prevent="onDropTable"
style="height: 150px; border: 1px #d2cfcf45 solid; overflow-y: auto;"
>
<a-tree
v-if="tableRelationData.mainTable !== ''"
ref="folderTree"
:treeData="tableTreeData"
:expandedKeys="tableConnectExpandedKeys"
:selectedKeys="tableConnectSelectedKeys"
:autoExpandParent="tableConnectAutoExpandParent"
showLine
show-icon
@expand="onFolderTreeExpand"
@select="onFolderTreeSelect">
<a-icon slot="switcherIcon" type="down" />
<!-- <a-icon slot="folder" type="folder" /> -->
</a-tree>
<a-empty v-else description="请将左侧表拖放至此" style="position: relative; top: 50%; transform: translateY(-50%);"></a-empty>
</div>
</div>

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

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

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

完整的效果:

完整的代码:

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

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. PHP preg_replace_callback_array() 函数

    preg_replace_callback_array 函数执行一个正则表达式搜索并且使用一个回调进行替换.高佣联盟 www.cgewang.com 该函数在 PHP7+ 版本支持. 语法 mixed ...

  2. C/C++编程笔记:C语言入门知识点(三),请收藏C语言最全笔记!

    今天我们继续来学习C语言的入门知识点,第一课:C/C++编程笔记:C语言入门知识点(二),请收藏C语言最全笔记! 21. 输入 & 输出 当我们提到输入时,这意味着要向程序填充一些数据.输入可 ...

  3. luogu P4294 [WC2008]游览计划

    LINK:游览计划 斯坦纳树例题. 斯坦纳树是这样一类问题:带权无向图上有K个关键点 求出包含这K个点的最小生成树. 也就是说 求最小生成树 但是 并不是整张图 仅限于K个点. 可以发现我们利用克鲁斯 ...

  4. Typora+PicGo-Core(command line)+SMMS、github、gitee实现Typora图片上传到图床

    Typora+PicGo-Core(command line)+SMMS.github.gitee实现Typora图片上传到图床 1 安装插件2 配置config.json    2.1 设置SMMS ...

  5. Eclipse RCP:多平台部署

    1 问题 在使用Eclipse RCP IDE进行开发时,它自带的PDE(插件开发环境)工具仅能够导出相同平台的部署包,比如win32的仅能导出win32的,linux64仅能够导出linux64的. ...

  6. 面经手册 · 第2篇《数据结构,HashCode为什么使用31作为乘数?》

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 在面经手册的前两篇介绍了<面试官都问我啥>和<认知自己的技术栈盲区 ...

  7. 016_go语言中的递归

    代码演示 package main import "fmt" func fact(n int) int { if n == 0 { return 1 } return n * fa ...

  8. MinIO很强-让我放弃FastDFS拥抱MinIO的8个理由

    目前可用于文件存储的网络服务选择有很多,比如阿里云OSS.七牛云.腾讯云等等,但是收费都有点小贵.为了帮公司节约成本,之前一直是使用fastDFS作为文件服务器,准确的说是图片服务器.直到我发现了Mi ...

  9. CNN 小结

    CNN 小结 目录 CNN特征提取过程(卷积核描述的是特征信息, 此特征可能就是原图像中的某些像素, 但是卷积核并不找相似的地方在原始图像的哪里, 所以需要将卷积核不断地滑动, 得到的feature ...

  10. artifactdescriptorexception:Failed to read artifact descriptor for xxx:jar ”

    在Eclipse中执行Maven的install命令时,报“Failed to read artifact descriptor for xxx:jar ”的错误.这可能是在下载过程中文件出现错误.或 ...