当前位置: 首页 > news >正文

Vue3实现可视化拖拽标签小程序

介绍

在这里插入图片描述

实现功能:可视化标签拖拽,双击标签可修改标签内容

HTML结构

<div class="box" v-move><div class="header">标签1</div><div @dblclick="startEditing" v-if="!isEditing">{{content}}</div><input type="text" v-model="editedContent" @blur = 'stopEditing' v-if="isEditing">
</div>

一个大DIV包含里面存放两个DIV一个input
header为头部标签名称
内容区域绑定双击鼠标事件,触发开始修改事件(startEditing),使用v-if进行标签的显示和隐藏操作
input标签,事件绑定为修改内容,绑定获取焦点事件(@blue=“stopEditing”),并且绑定和内容区域一样的变量用来控制显示隐藏,一方为显示另一方必定为隐藏

TS部分

import { Directive, DirectiveBinding } from "vue";const vMove: Directive<any, void> = {mounted(el: HTMLElement, binding: DirectiveBinding) {// 创建一个变量 moveElement,表示 DOM 元素的子元素(假设这是要拖动的元素)const moveElement: HTMLDivElement = el.firstElementChild as HTMLDivElement;// 鼠标按下事件处理函数const mouseDown = (e: MouseEvent) => {// 计算鼠标相对于元素的偏移量const X = e.clientX - el.offsetLeft;const Y = e.clientY - el.offsetTop;// 鼠标移动事件处理函数const move = (e: MouseEvent) => {// 更新元素的位置,实现拖动效果el.style.left = e.clientX - X + "px";el.style.top = e.clientY - Y + "px";};// 添加鼠标移动事件监听器document.addEventListener("mousemove", move);// 添加鼠标松开事件监听器,用于停止拖动document.addEventListener("mouseup", () => {document.removeEventListener("mousemove", move);});};// 将鼠标按下事件处理函数添加到元素上moveElement.addEventListener("mousedown", mouseDown);},
};

采用自定义指令进行设置移动组件,DirectiveDirectiveBinding:这是Vue.js中用于自定义指令的一些类型和功能。自定义指令允许你在DOM元素上附加自定义行为。Directive 是自定义指令的基本类型,而 DirectiveBinding 是与指令绑定的数据的类型。

上述代码定义了一个名为 vMove 的自定义指令,它会在元素上附加拖动行为。当鼠标在 moveElement(元素的子元素)上按下时,启动拖动操作,通过鼠标移动事件更新元素的位置,并在鼠标松开时停止拖动。这个自定义指令可以在Vue.js应用中使用,将其添加到需要拖动的元素上,以实现拖拽功能。

<script setup lang="ts">
// 导入 Vue 和自定义指令相关的模块
import { ref, Directive, DirectiveBinding } from "vue";// 自定义指令 vMove 的实现
const vMove: Directive<any, void> = (el: HTMLElement, binding: DirectiveBinding) => {// 获取需要移动的 DOM 元素,假设它是传入元素的第一个子元素let moveElement: HTMLElement = el.firstElementChild as HTMLDivElement;console.log(moveElement);// 鼠标按下事件处理函数const mouseDown = (e: MouseEvent) => {// 计算鼠标点击位置相对于元素左上角的偏移量let X = e.clientX - el.offsetLeft;let Y = e.clientY - el.offsetTop;// 鼠标移动事件处理函数const move = (e: MouseEvent) => {console.log(e);// 更新元素的位置,实现拖动效果el.style.left = e.clientX - X + "px";el.style.top = e.clientY - Y + "px";};// 添加鼠标移动事件监听器,以便拖动元素document.addEventListener("mousemove", move);// 添加鼠标松开事件监听器,停止拖动document.addEventListener("mouseup", () => {document.removeEventListener("mousemove", move);});};// 将鼠标按下事件处理函数添加到移动元素上moveElement.addEventListener("mousedown", mouseDown);console.log(binding);
};// 使用 ref 创建响应式数据
const content = ref('内容'); // 原始内容
const isEditing = ref(false); // 是否处于编辑模式
const editedContent = ref(''); // 编辑后的内容// 进入编辑模式
const startEditing = () => {isEditing.value = true;editedContent.value = content.value; // 将原始内容设置为编辑后的内容
}// 退出编辑模式
const stopEditing = () => {isEditing.value = false;content.value = editedContent.value; // 保存编辑后的内容
}</script><template><div class="box" v-move><div class="header">标签1</div><!-- 使用双击事件触发编辑模式 --><div @dblclick="startEditing" v-if="!isEditing">{{ content }}</div><!-- 编辑模式下显示输入框 --><input type="text" v-model="editedContent" @blur="stopEditing" v-if="isEditing"></div>
</template><style scoped>
.box {position: fixed;left: 50%;top: 50%;transform: translate(-50%, -50%);width: 200px;height: 200px;border: 3px solid;background: #f59c09;.header {height: 20px;background: #f59c09;color: white;}
}
</style>

相关文章:

Vue3实现可视化拖拽标签小程序

介绍 实现功能&#xff1a;可视化标签拖拽&#xff0c;双击标签可修改标签内容 HTML结构 <div class"box" v-move><div class"header">标签1</div><div dblclick"startEditing" v-if"!isEditing">{{content…...

SSM 前端使用AJAX方式,fromdata文件格式上传二进制流文件

今天在上课的时候&#xff0c;遇到了一个比较坑的问题&#xff0c;有个学生拿来了她的代码&#xff0c;让我给她看看为什么传值传不过来。 首先&#xff0c;前端是这样的&#xff1a; function upload(){var formData new FormData();formData.append(images, $(#previewImg)…...

LeetCode-455-分发饼干-贪心算法

题目描述&#xff1a; 假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。 对每个孩子 i&#xff0c;都有一个胃口值 g[i]&#xff0c;这是能让孩子们满足胃口的饼干的最小尺寸&#xff1b;并且每块饼干 j&#xff…...

新版 Next.js 从入门到入土

本教程用的Next.js 是 13 版本 Next.js 简介 完善的React项目&#xff0c;搭建轻松自带数据同步&#xff0c;解决服务端渲染最大难点丰富的插件灵活配置 创建第一个项目 手动创建 初始化 npm init安装所需要的依赖包 npm install --save react react-don next增加快捷命…...

OpenCV(十):图像缩放、翻转、拼接的介绍与使用

目录 &#xff08;1&#xff09;图像缩放&#xff1a;resize() &#xff08;2&#xff09;图像翻转&#xff1a; flip() &#xff08;3&#xff09;图像拼接&#xff1a;hconcat() 和vconcat() &#xff08;1&#xff09;图像缩放&#xff1a;resize() 使用 cv2.resize() 函…...

C++ 学习之 构造函数 和 析构函数

前言 总的来说&#xff0c;构造函数负责对象的初始化&#xff0c;而析构函数负责对象的清理和资源释放。它们是C面向对象编程中非常重要的概念&#xff0c;用于管理对象的生命周期&#xff0c;确保对象在创建和销毁时都能够正确地进行初始化和清理。 正文 看代码 class perso…...

加快 MySQL 数据迁移

目录 一、先导 1. 自建目标实例 2. 配置目标主从 二、源导出 1. 生成查询用户权限的SQL语句 2. 生成权限的SQL语句 3. 生成创建非主键索引的SQL语句 4. 导出源库结构 5. 导出源库数据 三、目标导入 1. 目标实例设置 2. 创建用户与权限 3. 处理结构导出文件 4. 导…...

CANalyzer panel

(1205条消息) CAPL 脚本中对信号&#xff0c;系统变量&#xff0c;环境变量的 事件响应_capl programs脚本怎么写信号运算_蚂蚁小兵的博客-CSDN博客 注意环境变量是在工程关联的dbc中创建的&#xff1b;而系统变量是在CANoe工程工具栏的”Environment”下的”System Variables”…...

延迟队列的理解与使用

目录 一、场景引入 二、延迟队列的三种场景 1、死信队列TTL对队列进行延迟 2、创建通用延时消息死信队列 对消息延迟 3、使用rabbitmq的延时队列插件 x-delayed-message使用 父pom文件 pom文件 配置文件 config 生产者 消费者 结果 一、场景引入 我们知道可以通过TT…...

jQuery成功之路——jQuery的DOM操作简单易懂

jQuery的DOM操作 1.jQuery操作内容 jQuery操作内容 1. text() 获取或修改文本内容 类似于 dom.innerText 2. html() 获取或修改html内容 类似 dom.innerHTML 注意: 1. text() 是获取设置所有 2. html() 是获取第一个,设置所有 <!DOCTYPE html> <html lang"zh…...

C++ 学习系列 -- 智能指针 make_shared 与 make_unique

一 make_shared 1.1 make_shared 是什么&#xff1f; c 11 中 引入了智能指针 shared_ptr&#xff0c;以及一个模板函数 make_shared 来生成一个制定类型的 shared_ptr。 1.2 引入 make_shared &#xff0c;解决了什么问题&#xff1f; make_shared的引入&#xff0c;主…...

贝叶斯神经网络 - 捕捉现实世界的不确定性

贝叶斯神经网络 - 捕捉现实世界的不确定性 Bayesian Neural Networks 生活本质上是不确定性和概率性的&#xff0c;贝叶斯神经网络 (BNN) 旨在捕获和量化这种不确定性 在许多现实世界的应用中&#xff0c;仅仅做出预测是不够的&#xff1b;您还想知道您对该预测的信心有多大。例…...

games101作业1

题目 给定三维下三个点 v0(2.0, 0.0, −2.0), v1(0.0, 2.0, −2.0), v2(−2.0, 0.0, −2.0), 你需要将这三个点的坐标变换为屏幕坐标并在屏幕上绘制出对应的线框三角形 (在代码框架中&#xff0c;我们已经提供了 draw_triangle 函数&#xff0c;所以你只需要去构建变换矩阵即可…...

LeetCode 面试题 02.08. 环路检测

文章目录 一、题目二、C# 题解 一、题目 给定一个链表&#xff0c;如果它是有环链表&#xff0c;实现一个算法返回环路的开头节点。若环不存在&#xff0c;请返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了…...

【Linux】线程安全-生产者消费者模型

文章目录 生产者消费者模型123规则应用场景优点忙闲不均生产者和消费者解耦支持高并发 代码模拟 生产者消费者模型 123规则 1个线程安全的队列&#xff1a;只要保证先进先出特性的数据结构都可以称为队列 这个队列要保证互斥&#xff08;就是保证当前只有一个线程对队列进行操…...

优化(2) 2023/09/03

今天重新温习了下clean abap&#xff0c;以前只是偶尔打开看几眼。今天把有些自己不熟悉的地方&#xff0c;重点研究了下。有几个点可以在以后工作使用。这几点可能并不能提升程序效率&#xff0c;但会大大提高代码可读性和代码的可扩展性&#xff1a; 用insert XXX into tabl…...

Swap and Reverse 题解

Swap and Reverse 题面翻译 题目描述 本题共有 t t t 组数据。 给定一个长度为 n n n 的字符串 s s s 和一个整数 k k k&#xff0c; s s s 只包含小写字母&#xff0c;你可以进行若干次操作&#xff08;可以是零次&#xff09;&#xff0c;具体操作如下&#xff1a; 选…...

单元测试:优雅编写Kotlin单元测试

一、MockK简介 MockK是一款功能强大、易于使用的Kotlin mocking框架。在编写单元测试时&#xff0c;MockK能够帮助我们简化代码、提高测试覆盖率&#xff0c;并改善测试的可维护性。除了基本用法外&#xff0c;MockK还提供了许多额外的功能和灵活的用法&#xff0c;让我们能够…...

深度学习入门教学——卷积神经网络CNN

目录 一、CNN简介 一、输入层 二、卷积层 三、池化层 四、全连接层 一、CNN简介 1、应用领域 检测任务 分类与检索 超分辨率重构 2、卷积网络与传统网咯的区别 传统神经网络和卷积神经网络都是用来提取特征的。神经网络&#xff1a; 可以将其看作是一个二维的。卷积神经…...

【MySQL】MySQL系统变量(system variables)列表(mysqld --verbose --help的结果例)

文章目录 【MySQL】MySQL系统变量&#xff08;system variables&#xff09;列表&#xff08;mysqld --verbose --help的结果例&#xff09;mysqld --verbose --help的结果例参考 【免责声明】文章仅供学习交流&#xff0c;观点代表个人&#xff0c;与任何公司无关。 编辑|SQL和…...

Windows 11 + Ubuntu 20.04双系统避坑:搞定WiFi图标消失的完整保姆级流程

Windows 11与Ubuntu 20.04双系统WiFi修复全指南1. 双系统网络问题的根源探究刚完成Windows 11和Ubuntu 20.04双系统安装的用户&#xff0c;经常会遇到一个令人头疼的问题——Ubuntu系统下WiFi图标神秘消失。这不是个例&#xff0c;而是双系统环境下相当普遍的现象。要彻底解决这…...

FPG平台:客户服务专业能力的深度解读

FPG平台&#xff1a;客户服务专业能力的深度解读金融服务的核心是信任&#xff0c;而信任的建立需要在多个细节上保持持续的投入。FPG平台在合规、技术、服务、教育等方向上的实践&#xff0c;为客户提供了一个较为可靠的服务环境。本文从评测视角对其进行系统性的观察&#xf…...

Keil MDK许可证错误解决方案与调试技巧

1. 问题现象与背景解析 当使用Keil MDK进行嵌入式开发时&#xff0c;部分用户在编译或调试阶段会遇到"LICENSE: License Mapping Failed"的错误提示。这个报错通常出现在以下两种场景&#xff1a; 编译阶段&#xff1a;在Build Output窗口突然弹出红色错误提示&…...

外观专利和实用新型

外观设计专利与实用新型专利:技术创新的法律双翼 谨以此文,献给每一位在产品创新与外观设计之间寻求法律护城河的工程师、架构师与技术决策者。外观设计专利与实用新型专利,如同一对孪生兄弟——一个守护“美学表达”,一个护卫“实用改进”;一个关乎“看起来怎样”,一个关…...

WSL2 2023史诗级更新实测:你的.wslconfig文件真的配对了吗?(从版本检查到稀疏VHD全流程)

WSL2 2023史诗级更新实战&#xff1a;从版本适配到性能调优全解析如果你最近尝试在WSL2中配置网络功能时遇到各种"玄学问题"&#xff0c;比如代理失效、端口转发异常或是磁盘空间莫名被占满&#xff0c;很可能是因为忽略了版本兼容性这个关键前提。2023年9月后&#…...

用Python复现电池寿命预测论文:从数据清洗到模型调优的完整实战(附代码)

用Python实战电池寿命预测&#xff1a;从特征工程到模型优化的全流程解析在新能源与储能技术快速发展的今天&#xff0c;锂离子电池的健康状态&#xff08;SOH&#xff09;预测已成为工业界和学术界共同关注的核心课题。不同于传统实验室环境下耗时数月的电池老化测试&#xff…...

别再只跑代码了!用泰坦尼克号数据集,手把手教你从EDA到模型调优的完整数据分析实战

从数据洞察到模型优化&#xff1a;泰坦尼克号生存预测的深度实践指南 如果你已经能够熟练运行数据分析代码&#xff0c;却依然对项目全流程缺乏系统性认知&#xff0c;这篇文章将带你超越基础操作&#xff0c;深入理解数据分析的完整闭环。我们将以经典的泰坦尼克号数据集为例&…...

RuoYi接口调试:Postman作为Spring Boot权限系统可信信使

1. 为什么RuoYi项目里Postman不是“配角”&#xff0c;而是调试生命线在RuoYi开发实战中&#xff0c;很多人把Postman当成一个“临时工具”——写完接口顺手点一下&#xff0c;成功了就扔一边&#xff0c;失败了就切回IDE疯狂加日志、重启服务、反复试错。我带过三届实习生&…...

MDK Middleware网络组件的嵌入式安全防护解析

1. MDK Middleware网络组件的安全特性解析在嵌入式系统开发中&#xff0c;网络安全往往是最容易被忽视却又至关重要的环节。作为Keil MDK开发环境的核心组件&#xff0c;Middleware Network为Cortex-M系列微控制器提供了轻量级TCP/IP协议栈实现。不同于桌面级操作系统自带的网络…...

AI代理运行时基础设施:从上下文溢出到持久化事件日志

1. 这不是新赛道&#xff0c;是 runtime 层的“操作系统时刻”来了你有没有在深夜调试一个跑了三小时的 AI 代理&#xff0c;突然发现它开始胡言乱语&#xff1f;不是模型崩了&#xff0c;不是 prompt 写错了&#xff0c;而是——它的“记忆”被挤掉了。上下文窗口就那么大&…...