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>

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

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

相关文章

windows 2012服务器配置nginx后无法访问域名的问题

环境&#xff1a;Windows 2012 R2 Nginx 问题&#xff1a;确认域名解析到服务器ip已生效&#xff08;通过ping域名地址确认域名已指向该ip&#xff09;&#xff0c;确认nginx配置无误&#xff08;绑定域名、配置端口、配置网站文件目录&#xff09;&#xff0c;但无法从外网访…

自动化运维:Ansible之playbook基于ROLES部署LNMP平台

目录 一、理论 1.playbook剧本 2.ROLES角色 3.关系 4.Roles模块搭建LNMP架构 二、实验 1.Roles模块搭建LNMP架构 三、问题 1.剧本启动php报错语法问题 2.剧本启动mysql报错语法问题 3.剧本启动nginx开启失败 4.剧本安装php失败 5.使用yum时报错 6.rpm -Uvh https…

A 股个股资金流 API 数据接口

A 股个股资金流 API 数据接口 全量股票资金流数据&#xff0c;全量A股数据&#xff0c;最长30日历史数据 1. 产品功能 支持所有A股资金流数据查询&#xff1b;每日定时更新数据&#xff1b;支持多达 30 日历史数据查询&#xff1b;超高的查询效率&#xff0c;数据秒级返回&am…

MongoDB实验——在MongoDB集合中查找文档

在MongoDB集合中查找文档 一、实验目的二、实验原理三、实验步骤1.启动MongoDB数据库、启动MongoDB Shell客户端2.数据准备-->person.json3.指定返回的键4 .包含或不包含 i n 或 in 或 in或nin、$elemMatch&#xff08;匹配数组&#xff09;5.OR 查询 $or6.Null、$exists7.…

Windows7安装SSH客户端的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

【数据结构】2015统考真题 6

题目描述 【2015统考真题】求下面的带权图的最小&#xff08;代价&#xff09;生成树时&#xff0c;可能是Kruskal算法第2次选中但不是Prim算法&#xff08;从v4开始&#xff09;第2次选中的边是&#xff08;C&#xff09; A. (V1, V3) B. (V1, V4) C. (V2, V3) D. (V3, V4) …

ToBeWritten之VSOC安全运营

也许每个人出生的时候都以为这世界都是为他一个人而存在的&#xff0c;当他发现自己错的时候&#xff0c;他便开始长大 少走了弯路&#xff0c;也就错过了风景&#xff0c;无论如何&#xff0c;感谢经历 转移发布平台通知&#xff1a;将不再在CSDN博客发布新文章&#xff0c;敬…

华为OD机试 - 敏感字段加密(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#xff09;》…

微软表示Visual Studio的IDE即日起开启“退休”倒计时

据了解&#xff0c;日前有消息透露称&#xff0c;适用于 Mac平台的Visual Studio集成开发环境(IDE)于8月31日启动“退休”进程。 而这意味着Visual Studio for Mac 17.6将继续支持12个月&#xff0c;一直到2024年8月31日。    微软表示后续不再为Visual Studio for Mac开发…

ebay测评,物理环境与IP环境:解决平台风控问题的关键

近期eBay平台出现了大量风控问题&#xff0c;导致许多买家账号受到影响。实际上&#xff0c;这主要是由于环境搭建方面存在主要问题。时至2023年&#xff0c;许多人的技术方案仍停留在几年前&#xff0c;要么使用一键新机工具配合国外IP&#xff0c;要么使用指纹浏览器配合国外…

结构化日志记录增强网络安全性

日志是一种宝贵的资产&#xff0c;在监视和分析应用程序或组织的 IT 基础结构的整体安全状况和性能方面发挥着至关重要的作用。它们提供系统事件、用户活动、网络流量和应用程序行为的详细记录&#xff0c;从而深入了解潜在威胁或未经授权的访问尝试。虽然组织历来依赖于传统的…

MySQL基础篇:数据库概述和部署

SQL 概述 SQL&#xff0c;一般发音为sequel&#xff0c;SQL的全称Structured Query Language)&#xff0c;SQL用来和数据库打交道&#xff0c;完成和数据库的通信&#xff0c;SQL是一套标准。但是每一个数据库都有自己的特性别的数据库没有,当使用这个数据库特性相关的功能,这…