vue中的 拖拽
拖拽总结
| 实现方式 | 特点 | 适用场景 |
|---|---|---|
| HTML5 原生拖拽 API | ✅ 直接使用 dataTransfer 进行数据传输✅ 兼容性好(大部分浏览器支持) ✅ 适合简单的拖拽场景 | 低代码平台、表单生成器、组件拖拽 |
| Vue/React 组件库(如 Vue Draggable、SortableJS) | ✅ 提供更丰富的交互效果 ✅ 支持列表排序、拖拽嵌套 ❌ 依赖额外的库 | 复杂拖拽,如列表排序、树状结构 |
| CSS 仅视觉拖拽(无交互) | ✅ 仅改变视觉位置,无数据交互 ❌ 无法存储拖拽数据 | 简单 UI 动画 |
目录
拖拽总结
HTML5 原生拖拽API(Drag and Drop API)
相关代码知识点:
e.dataTransfer.setData(format, data):
e.dataTransfer.effectAllowed = 'copy'; 设置拖拽的效果,表示拖拽的操作类型:
@dragover.prevent
@drop="onDropCanvas"
e.dataTransfer.getData('text/plain');:获取拖拽的数据(之前 dragstart 事件 setData 的数据)。
JSON.parse(itemData);:解析 JSON 数据,得到组件信息。
例子 —— 简易拖拽代码(H5: dataTransfer.setData + store 维护数据)
本例分析:
拖拽流程:
两种拖拽方式:
HTML5 原生拖拽API(Drag and Drop API)
分为:拖拽源 和 拖拽目标。适用于vue低代码开发。(若要 拖拽嵌套 或 复杂排序,考虑 Vue Draggable(基于 SortableJS))
拖拽源 -> 拖拽开始(dragstart)
设置
dataTransfer.setData()存储拖拽的数据。设置
effectAllowed允许的拖拽行为。
draggable="true":启用 HTML5 拖拽。
@dragstart触发onDragStart(),存储数据。
e.dataTransfer.setData('text/plain', JSON.stringify(item))让drop端获取拖拽的数据。拖拽过程中(dragover)——(事件:
dragover,即拖拽对象悬停在目标上时触发)
- 必须
preventDefault(),否则drop事件不会触发拖拽目标 -> 拖拽结束(drop)
读取
dataTransfer.getData()获取拖拽的数据。在目标区域渲染组件。
@dragover.prevent:阻止默认行为,允许drop触发。(默认情况下,浏览器不允许drop)
@drop="onDropCanvas":处理组件释放到画布的逻辑。
e.dataTransfer.getData('text/plain')读取拖拽的数据。
canvasComponents.value.push()添加组件到画布。
相关代码知识点:
-
e.dataTransfer.setData(format, data):-
作用:设置拖拽时传输的数据,这样在
drop事件时可以取回。 -
text/plain:表示数据格式为纯文本字符串(不同浏览器可能要求必须是文本格式)。 -
JSON.stringify(item):将item(对象)转换为字符串存储,方便drop事件解析。
-
⚠ 注意:不设置 setData,某些浏览器可能无法正确触发 drop 事件。
-
e.dataTransfer.effectAllowed = 'copy'; 设置拖拽的效果,表示拖拽的操作类型:
-
'copy':表示复制(不会影响原始数据)。 -
'move':表示移动(可能会删除原始数据)。 -
'link':表示创建链接。
-
-
@dragover.prevent-
事件:
dragover(拖拽对象悬停在目标上时触发)。 -
prevent:阻止默认行为(默认情况下,浏览器不允许drop)。
-
-
@drop="onDropCanvas"-
事件:
drop(用户松开鼠标时触发)。 -
作用:获取拖拽的数据;将组件添加到画布;更新 UI 状态。
-
-
e.preventDefault();:避免浏览器默认行为(如打开文件)。 -
e.dataTransfer.getData('text/plain');:获取拖拽的数据(之前dragstart事件setData的数据)。 -
JSON.parse(itemData);:解析 JSON 数据,得到组件信息。 -
store.addComponentToCanvas(component);:将组件添加到画布中。
例子 —— 简易拖拽代码(H5: dataTransfer.setData + store 维护数据)
<!-- test.vue --> <script setup> import e from 'cors'; import { store } from './store.js';const componentList = [{ id: 1, type: 'Container' },{ id: 2, type: 'Text'}, ]; // 拖拽开始事件 const onDragStart = (e, item) => {e.dataTransfer.setData('text/plain', JSON.stringify(item)); // 设置拖拽开始 传输的数据,纯文本 字符串,将 item 对象 转为字符串存储,便于后续drop解析e.dataTransfer.effectAllowed = 'copy'; // 拖拽效果,拖拽类型。copy 指 复制,不影响原数据;move,表 移动,可能会删原数据;link,表示创建链接store.setDragItem(item, true); // 记录当前正在拖拽的组件信息。true表示从组件库拖拽。(区分,从组件库 拖拽,和 画布内拖拽) } const onDropCanvas = () => {// const itemData = e.dataTransfer.getData('text/plain'); // 获取拖拽的数据// if(!itemData) return;// const item = JSON.parse(itemData); // 将字符串转为对象console.log("drop拖拽开始")store.dropToCanvas(null); } </script> <template><div class="app1"><h3>组件库(可拖动)</h3><div v-for="(item, index) in componentList":key="item.id"class="draggable-item"draggable="true"@dragstart="onDragStart($event, item)">{{ item.type }}</div><h3>画布区域</h3><div class="canvas"@dragover.prevent@drop="onDropCanvas"><!--@dropover.prevent 阻止默认行为。(默认情况下,浏览器不允许drop) --><div v-for="(item, index) in store.treeData" :key="item.id" class="draggable-item">{{ item.type }}-{{ item.id }}</div></div></div> </template> <style scoped lang='scss'> .app1 {padding: 20px;.draggable-item {border: 1px solid #ccc;text-align: center;width: 300px;height: 100px;line-height: 100px;background:pink;}.canvas {border: 2px dashed #ccc;width: 500px;height: 300px;margin-top:20px;// background: skyblue;} } </style>// store.js import { reactive } from 'vue' export const store = reactive({treeData: [], // 画布中的组件数据dragItem: null, // 当前拖拽的组件isRawComponents: false, // 是否是组件库的// 设置当前拖拽的组件setDragItem(item, isRawComponents = false){this.dragItem = item;this.isRawComponents = isRawComponents;console.log("设置当前拖拽的组件。")},// 拖拽到画布中dropToCanvas() {if(!this.dragItem) return;const newItem = {id: Date.now(),type: this.dragItem.type,children: [], // 支持未来qiantao};this.treeData.push(newItem);console.log("拖拽到画布。")this.dragItem = null; // 清空拖拽数据} })
本例分析:
通过 全局
store维护了拖拽数据,而不是使用dataTransfer.getData来获取拖拽数据。
onDragStart事件
当用户开始拖拽组件库中的组件时,会执行
onDragStart方法。
onDragStart里除了使用e.dataTransfer.setData之外,还调用了store.setDragItem(item, true),这个方法的作用是在全局的 store 里记录当前拖拽的组件信息,并标记它是从组件库拖拽的(true)。
onDropCanvas事件
当拖拽到画布区域并触发
onDropCanvas时,并没有使用e.dataTransfer.getData获取数据。取而代之的是
store.dropToCanvas(null);,这个方法直接从store里获取之前存储的dragItem并添加到treeData里。
dropToCanvas方法
dropToCanvas方法检查this.dragItem是否存在,如果存在,就创建一个新的newItem并添加到treeData里。这样,数据传递并没有通过
dataTransfer.getData,而是通过全局store变量来完成的。
拖拽流程:
onDragStart(e, item)→store.setDragItem(item, true);记录拖拽的组件数据。
onDropCanvas()→store.dropToCanvas(null);获取store.dragItem并添加到treeData里。
两种拖拽方式:
①dataTransfer.setData 和 getData 适用于不同的页面或应用之间的数据传递,但
②在同一个 Vue 组件的状态管理下,getData部分 完全可以使用 Vue 的 store 机制来管理拖拽数据。
②用 Vue 的
store机制来管理拖拽数据的优势:
避免
dataTransfer.getData只能存储字符串的限制,直接在store里存储对象数据,不用手动JSON.stringify和JSON.parse。数据可以跨多个事件存储,即使拖拽过程中发生变化(比如鼠标移动到不同位置),仍然可以获取正确的数据。
更方便管理拖拽状态,比如可以在
store里添加isDragging状态,防止意外行为。
相关文章:
vue中的 拖拽
拖拽总结 实现方式特点适用场景HTML5 原生拖拽 API✅ 直接使用 dataTransfer 进行数据传输 ✅ 兼容性好(大部分浏览器支持) ✅ 适合简单的拖拽场景低代码平台、表单生成器、组件拖拽Vue/React 组件库(如 Vue Draggable、SortableJSÿ…...
Linux进程间通信(1)
1.IPC 1.什么是IPC? Inter Process Communication 2.进程间通信常用的几种方式 1,管道通信:有名管道,无名管道 2,信号- 系统开销小 3,消息队列-内核的链表 4,信号量-计数器 5,共享…...
Scala相关知识学习总结3
包 - 包声明:和Java类似,作用是区分同名类、管理类命名空间。Scala包名只能含数字、字母等,不能数字开头、不能用关键字。 - 包说明:有类似Java的包管理风格,也有独特嵌套风格。嵌套风格有两个特点,一是&…...
Opencv计算机视觉编程攻略-第七节 提取直线、轮廓和区域
第七节 提取直线、轮廓和区域 1.用Canny 算子检测图像轮廓2.用霍夫变换检测直线;3.点集的直线拟合4.提取连续区域5.计算区域的形状描述子 图像的边缘区域勾画出了图像含有重要的视觉信息。正因如此,边缘可应用于目标识别等领域。但是简单的二值边缘分布图…...
中和农信:让金融“活水”精准浇灌乡村沃土
2025年政府工作报告首提“投资于人”概念,并22次提及“金融”,强调要着力抓好“三农”工作,深入推进乡村全面振兴;一体推进地方中小金融机构风险处置和转型发展;扎扎实实落实促进民营经济发展的政策措施,切…...
背包DP总结
牛客周赛 Round 81 E.建筑入门 知识点:完全背包,完全背包的路径转移以及回溯 由题意可以推导出,下层麻将的数字一定大于上层数字,所以我们可以假设一个最基础的麻将塔,也就是: 1 2 2 3 3 3 … 形如这样的&…...
Labview信号采集与多功能分析系统(可仿真)
1.摘要 《Labview信号采集与多功能分析系统》可以实时分析信号的时域特征,例如信号的均值、方差、峰值、峭度等。系统可以进行信号的自相关与互关分析。此系统也可以分析信号的频域特征,包括快速傅里叶变换后的时频特征、短时傅里叶变换STFT后的时频域特…...
【C#使用S7.NET库读取和写入西门子PLC变量】
C#使用S7.NET库读取和写入西门子PLC变量 前言使用S7.NET库读取使用S7.NET库写入 前言 本来想用Wincc的接口给读和写Wincc,但是速度实在太感人了,所以不如直接读和写PLC的变量,这种方式速度瞬间快了不知道多少倍(经测试4000个变量…...
蓝桥杯 游戏 6251 单调队列
传送门 0游戏 - 蓝桥云课 有了单调队列,在求解答案时:当我们需要对最大值的列表和最小值的列表进行俩俩组合,如果直接用两个f0r循环进行匹配,那么时间复杂度太大,容易超时。我们可以进行一个推导,假设最大…...
[250331] Paozhu 发布 1.9.0:C++ Web 框架,比肩脚本语言 | DeaDBeeF 播放器发布 1.10.0
目录 Paozhu 发布 1.9.0:C Web 框架,快速开发,比肩脚本语言DeaDBeeF 音乐播放器发布 1.10.0 版本! Paozhu 发布 1.9.0:C Web 框架,快速开发,比肩脚本语言 Paozhu (炮竹🧨) 是一个功…...
einsum函数
理解专家并行,需要了解einsum函数 import torch# 设置输入张量的维度:s 3 tokens, e 2 experts, c 2 capacity, m 4 embedding dim s, e, c, m 3, 2, 2, 4# 1. 输入 token 的嵌入向量 (s, m) reshaped_input torch.tensor([[1.0, 1.0, 1.0, 1.0],…...
gitee 配置git上传
Git入门?查看 帮助 , Visual Studio / TortoiseGit / Eclipse / Xcode 下如何连接本站, 如何导入仓库 简易的命令行入门教程: Git 全局设置: 以 176fuguM2项目为例 git config --global user.name "堕落圣甲虫" git config --global user.email "11…...
【电子通识】为什么电子元件的规格书常常要看英文版本
在我们查看电子器件规格书的时候,如果有中文版本和英文版本两种供我们选择,那我们常常需要查看英文版本,大家有想过这是为什么吗? 为什么英文规格书很重要? 电子元件规格书(Datasheet)常以英文版…...
Scala基础知识5
面向对象 Scala 的面向对象思想和 Java 的面向对象思想和概念是一致的。 Scala 中语法和 Java 不同,补充了更多的功能。 1.Scala包 基本语法:package 包名 Scala 包的三大作用(和 Java 一样) 1.区分相同名字的类。 2.当类很多…...
【图像处理基石】什么是RAW格式?
在图像处理中,RAW格式是一种未经处理、记录了相机传感器原始数据的图像文件格式。它保留了相机传感器捕捉到的全部原始信息,未经任何压缩或处理,因此被称为“原始数据”(Raw)。以下是关于RAW格式的详细解释:…...
AI Agent 实战:搭建个人在线旅游助手
AI Agent 实战:搭建个人在线旅游助手 本次实验中,我们将继续探索 Agent 的提示词,学习更加规范的提示词撰写方法。 本实验中你将掌握的知识点 使用 Dify 构建 Agent 的方法结构化的提示词撰写技巧变量的使用方法 1. 准备 在新建 Agent 之…...
【JavaScript】十四、轮播图
文章目录 实现一个轮播图,功能点包括: 自动播放鼠标经过暂时播放鼠标离开继续播放点击切换按钮手动切换 div盒子嵌套先写出静态HTML,再使用JS来修改样式和数据,渲染页面: <!DOCTYPE html> <html lang"…...
2025 全球音乐 AI 大模型对决:技术革新引领商业变革浪潮
未来的世界声音: 音乐产业如今正被 AI 技术推动着,开启一场智能革命的全新篇章。无论是旋律的诞生,还是工业化编曲的流程,AI 大模型都在以飞快的速度改变着行业的基本逻辑架构。在中国,昆仑万维依靠 Mureka 系列产品在…...
RabbitMQ详解,RabbitMQ是什么?架构是怎样的?
目录 一,RabbitMQ是什么? 二,RabbitMQ架构 2.1 首先我们来看下RabbitMQ里面的心概念Queue是什么? 2.2 交换器Exchange 2.3 RabbitMQ是什么? 2.4 重点看下优先级队列是什么? 三,RabbitMQ集群 3.1 普通集群模式 3.2 镜像队列集群 一,RabbitMQ是什么? 假设我们程序…...
Java 大视界 -- Java 大数据在智能教育自适应学习平台中的用户行为分析与个性化推荐(169)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
智能打印预约系统:微信小程序+SSM框架实战项目
微信小程序打印室预约系统,采用SSM(SpringSpringMVCMyBatis)经典框架组合。 一、系统核心功能详解 1. 智能化管理后台 用户数据看板打印店资源管理预约动态监控服务评价系统 2. 微信小程序端 智能定位服务预约时段选择文件…...
Redisson 操作 Redis Stream 消息队列详解及实战案例
目录 一、Redis Stream 概念 1.Redis消息队列-认识消息队列 2.Redis Stream特点 3.Redis Stream与RabbitMQ等消息队列的比较 二.Redis Stream基本操作命令 1.生产消息 2.消费消息 3.消费者组操作 4.确认消息处理 三、Redisson 操作 Stream 的核心 API 1. 获取流的API…...
【深度学习量化交易19】行情数据获取方式比测(1)——基于miniQMT的量化交易回测系统开发实记
我是Mr.看海,我在尝试用信号处理的知识积累和思考方式做量化交易,应用深度学习和AI实现股票自动交易,目的是实现财务自由~ 目前我正在开发基于miniQMT的量化交易系统——看海量化交易系统。 经常使用MiniQMT的朋友都知道,xtquant的…...
23种设计模式-结构型模式-代理
文章目录 简介问题解决方案代码核心设计要点 总结 简介 代理是一种结构型设计模式,让你能够提供对象的替代品或其占位符。代理控制着对于原对象的访问,并允许在把请求提交给对象前后进行一些处理。 问题 为什么要控制对于某个对象的访问呢?…...
Windows C++ 排查死锁
开发出来应用程序突然间卡死不动,如果其中是因为死锁问题卡列该如何排查 下面是一个简单的死锁例子 #include <iostream> #include <thread> #include <mutex>std::mutex a, b;void function_a() {std::lock_guard<std::mutex> _x(a);std:…...
ctfshow
1,web517 通过输入两个单引号让查询语句正常,判断是什么注入,使用的是什么字符 然后我们通过order by 判断回显位,进行一个联合查询注入 获取数据库名 ctfshow的sqli-labs和本地搭建最大的不同,就是show的flag不在当前…...
【AI论文】什么、如何、何处以及效果如何?大语言模型测试时缩放技术调研
摘要:随着预训练时代对计算(数据和参数)缩放的热情逐渐减退,测试时缩放(Test-Time Scaling, TTS),也被称作“测试时计算”,已成为一个备受瞩目的研究焦点。近期研究表明,…...
大模型学习一:deepseek api 调用实战以及参数介绍
一、说明 DeepSeek(杭州深度求索人工智能基础技术研究有限公司)是一家专注于大语言模型(LLM)研发的中国创新型科技公司,成立于2023年7月17日,由幻方量化孵化。其核心产品包括开源推理模型DeepSeek-R1、多模…...
C++ 编程指南33 - 使用模板来表达适用于多种参数类型的算法
一:概述 在 C 中,模板(Templates)提供了一种强大的泛型编程方式,使代码可以适用于不同的数据类型,而无需重复编写类似的逻辑。模板的主要目标是: 泛化能力(Generality)&a…...
MYSQL实现获取某个经纬度区域内的数据
1.创建表 2.插入表数据 INSERT INTO tf_sys.tf_location(name, longitude, latitude, location) VALUES (资料名称1, 114.437625, 16.016914, ST_GeomFromText(POINT(114.437625 16.016914))); INSERT INTO tf_sys.tf_location(name, longitude, latitude, location) VALUES (…...
