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 变量来完成的。


拖拽流程:
  1. onDragStart(e, item)store.setDragItem(item, true); 记录拖拽的组件数据。

  2. onDropCanvas()store.dropToCanvas(null); 获取 store.dragItem 并添加到 treeData

两种拖拽方式:

dataTransfer.setDatagetData 适用于不同的页面或应用之间的数据传递,但

②在同一个 Vue 组件的状态管理下,getData部分 完全可以使用 Vue 的 store 机制来管理拖拽数据。

②用 Vue 的 store 机制来管理拖拽数据优势

  • 避免 dataTransfer.getData 只能存储字符串的限制,直接在 store 里存储对象数据,不用手动 JSON.stringifyJSON.parse

  • 数据可以跨多个事件存储,即使拖拽过程中发生变化(比如鼠标移动到不同位置),仍然可以获取正确的数据。

  • 更方便管理拖拽状态,比如可以在 store 里添加 isDragging 状态,防止意外行为。

参考文献:

vue3 使用拖动插件vuedraggable@next - joken1310 - 博客园

Vue Draggable Next 安装和配置指南-CSDN博客

vue3使用拖拽组件draggable.next的使用教程【保姆级】_vue-draggable-next-CSDN博客

vue.draggable.next 中文文档 - itxst.com

https://github.com/SortableJS/vue.draggable.next

vue.draggable vue3例子

Vue-draggable-next 教程:轻松实现组件拖拽功能_慕课手记

vue3使用拖拽组件draggable.next的保姆级教程_vue.js_脚本之家

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/74855.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL 函数(入门版)

目录 一、字符串函数 1、常用的字符串函数 2、函数演示 3、具体案例 二、数值函数 1、常用的数值函数 2、函数演示 3、具体案例 三、日期函数 1、常用的日期函数 2、函数演示 3、具体案例 四、流程函数 1、常用的流程函数 2、函数演示 3、具体案例 在MySQL中&a…

基于快速开发平台与智能手表的区域心电监测与AI预警系统(源码+论文+部署讲解等)

需要源代码&#xff0c;演示视频&#xff0c;ppt设计原稿资料&#xff0c;请文末卡片联系 !](https://i-blog.csdnimg.cn/direct/242d53cd069940b5b7a6db2bb031d406.png#pic_center)

【神经网络】python实现神经网络(三)——正向学习的模拟演练

有了之前的经验(【神经网络】python实现神经网络(二)——正向推理的模拟演练),我们继续来介绍如何正向训练神经网络中的超参(包含权重以及偏置),本章大致的流程图如下: 一.损失函数 神经网络以某个指标为基准寻求最优权重参数,而这个指标即可称之为 “损失函数” 。(…

分区格式变RAW故障深度解析与数据恢复实战指南‌

分区格式变RAW的本质‌ 当存储设备&#xff08;如硬盘、U盘或移动硬盘&#xff09;的分区突然显示为RAW格式时&#xff0c;意味着操作系统无法识别其原有的文件系统结构&#xff08;如NTFS、FAT32等&#xff09;。此时&#xff0c;用户访问该分区会提示“需要格式化”或直接显示…

【QT】Qt5 QtWebEngine使用教程

目录 1、QtWebEngine相比于QtWebKit的优势2、项目配置2.1 确认 Qt 版本2.2 在.pro 文件中添加依赖3、显示网页4、实现Qt和网页JavaScript之间的交互4.1 Qt执行网页的JavaScript代码4.2 JavaScript调用Qt对象的函数QtWebEngine 是 Qt 框架中用于在应用程序中嵌入 Web 内容的模块…

网络安全-等级保护(等保) 1-0 等级保护制度公安部前期发文总结

################################################################################ 等级保护从1994年开始已经有相关文件下发&#xff0c;进行建设&#xff0c;后续今年多年制度完善&#xff0c;现在已进入等保2.0时代&#xff0c;相关政策已运行多年。 前期等保相关发文&…

视图函数的应用

1.实现将当前日期和时间编码为HTML文档并返回的简单视图函数 文章目录 1.实现将当前日期和时间编码为HTML文档并返回的简单视图函数1.1打开visualcode 按图示点击 创建新的终端1.2然后定义ViewDjango项目根目录下的路由文件urls.py&#xff0c;实现到SimpleView应用的路由路径1…

解锁 C 语言安全新姿势:C11 安全函数全解析

一、开篇:C 语言安全的新护盾 在 C 语言的编程世界里,缓冲区溢出等安全问题犹如潜藏的暗礁,时刻威胁着程序的稳定与安全。为了有效应对这些挑战,C11 标准引入了一系列安全函数,也被称为 “Annex K” 标准库函数。这些函数为字符串和内存操作函数注入了新的活力,通过增加…

BGP路由协议之属性2

Orgin 起源 公认必遵属性 起源名称标记描述IGPi如果路由是由始发的 BGP 路由器使用 network 命令注入到 BGP 的&#xff0c;那么该 BGP 路由的 origin 属性为 IGPEGPe如果路由是通过 EGP 学习到的&#xff0c;那么该 BGP 路由的 Origin 属性为 EGPIncomplete?如果路由是通过…

C#实现HiveQL建表语句中特殊数据类型的包裹

用C#实现搜索字符串中用’(‘和’)‘包裹的最外层的里面里面的字符串&#xff0c;将里面的记录按一个或多个空格、换行或tab&#xff0c;或者是它的在一起的组合作为分隔&#xff0c;分隔出多个字符串组&#xff0c;如果组中有字符串中同时包含’<‘和’>’&#xff0c;则…

脑电学习笔记

一&#xff0c;原理简介 使用eprime或者matlab给被试呈现刺激&#xff0c;并在某个时间发送Mark&#xff0c;脑电帽会同步采集被试的脑电信号&#xff0c;经放大器放大后&#xff0c;控制盒会把脑电信号和mark 信号同步到一起&#xff0c;通过usb线传入到采集系统&#xff08;比…

宏碁笔记本电脑擎7PRO搭载的 NVIDIA RTX 5080 显卡安装pytorch

宏碁笔记本电脑擎7PRO搭载的 NVIDIA RTX 5080 显卡是一款高性能移动 GPU&#xff0c;基于 NVIDIA 最新的 Blackwell 架构设计&#xff0c;通过修正架构&#xff08;Blackwell&#xff09;、显存类型与带宽&#xff08;GDDR7、960GB/s&#xff09;、Tensor Core 与 RT Core 全面…

ES6中增强对象

在 ES6 中&#xff0c;对象的使用变得更加方便了&#xff0c;可以在定义对象时通过属性简写、遍历作为属性名或省略对象函数属性的书写等方式来提高编码的效率&#xff1a; 其实就这么简单&#xff0c;大家可以好好看下上面的代码&#xff0c;有问题欢迎留言一起探讨&#xff0…

XSLFO XSLT:深入解析两种强大的XML转换技术

XSLFO & XSLT:深入解析两种强大的XML转换技术 引言 在XML(可扩展标记语言)的生态系统中,XSLFO(可扩展样式表语言格式化对象)和XSLT(可扩展样式表转换语言)是两种非常强大的技术。它们分别负责将XML文档转换为其他格式以及进行XML文档的转换。本文将深入探讨这两种…

Django4.0的快速查询以及分页

1. filter 方法 filter 是 Django ORM 中最常用的查询方法之一。它用来根据给定的条件过滤查询集并返回满足条件的对象。 articles Article.objects.all() # 使用 SearchFilter 进行搜索 search_param request.query_params.get(search, None) author_id request.query_pa…

在Vue3中格式化后端返回的Java Date类型数据为指定格式

在前端Vue3项目中&#xff0c;格式化后端返回的java.util.Date类型时间到yyyy-MM-dd HH:mm:ss格式&#xff0c;有几种常用方法&#xff1a; 方法一&#xff1a;使用JavaScript内置方法 <JAVASCRIPT> // 假设后端返回的数据结构为 { createTime: 2023-05-15T08:30:00.0…

单元测试原则之——不要模拟不属于你的类型

在单元测试中,不要模拟不属于你的类型(Don’t mock types you don’t own)是一个重要的原则。这是因为外部库或框架的类型(如第三方依赖)可能会在未来的版本中发生变化,而你的模拟可能无法反映这些变化,从而导致测试失效。 以下是一个基于Java Mockito 的示例,展示如何…

内网渗透(杂项集合) --- 中的多协议与漏洞利用技术(杂项知识点 重点) 持续更新

目录 1. NetBIOS 名称的网络协议在局域网中内网渗透中起到什么作用 2. 使用 UDP 端口耗尽技术强制所有 DNS 查找失败&#xff0c;这个技术如何应用在局域网内网渗透测试中 3. 在本地创建一个 HTTP 服务来伪造 WPAD 服务器 什么是 WPAD 服务器&#xff1f;这个服务器是干嘛的…

Git相关笔记1 - 本地文件上传远程仓库

Git相关笔记 目录 Git相关笔记Git上传相关文件第一步创建一个仓库&#xff1a;第二步本地创建空文件夹&#xff1a;第三步开始在gitbush上传文件&#xff1a;解决外网网络连接的问题&#xff1a;中文文件的编码问题&#xff1a;参考资料 Git上传相关文件 第一步创建一个仓库&a…

Cocos Creator 进行 Web 发布后,目录结构解析

在使用 Cocos Creator 进行 Web 发布后&#xff0c;生成的目录结构通常包含以下内容&#xff0c;下面为你详细介绍&#xff1a; 1. index.html 这是 Web 项目的入口 HTML 文件&#xff0c;它会加载所需的 JavaScript 文件和资源&#xff0c;从而启动游戏或应用程序。示例代码…