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

 更新时间:2023年09月04日 15:01:08   作者:饭一口口吃  
这篇文章主要介绍了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实现可视化拖拽标签小程序的文章就介绍到这了,更多相关Vue3拖拽标签小程序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue之this.$router.push页面刷新问题

    vue之this.$router.push页面刷新问题

    这篇文章主要介绍了vue之this.$router.push页面刷新问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • 手把手教你Vue-cli项目的搭建

    手把手教你Vue-cli项目的搭建

    这篇文章主要为大家详细介绍了Vue-cli项目的搭建方法,文中图片介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • 对Vue3中reactive的深入理解

    对Vue3中reactive的深入理解

    这篇文章主要介绍了对Vue3中reactive的深入理解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • vue项目用后端返回的文件流实现docx和pdf文件预览

    vue项目用后端返回的文件流实现docx和pdf文件预览

    本文主要介绍了vue项目用后端返回的文件流实现docx和pdf文件预览,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • antd中table展开行默认展示,且不需要前边的加号操作

    antd中table展开行默认展示,且不需要前边的加号操作

    这篇文章主要介绍了antd中table展开行默认展示,且不需要前边的加号操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • 十分钟带你读懂Vue中的过滤器

    十分钟带你读懂Vue中的过滤器

    过滤器提供给我们的一种数据处理方式。过滤器功能不是必须要使用的,因为它所实现的功能也能用计算属性或者函数调用的方式来实现。这篇文章主要为大家介绍了Vue中过滤器的使用,需要的可以了解一下
    2023-03-03
  • Vue组件的使用教程详解

    Vue组件的使用教程详解

    组件 (Component) 是 Vue.js 最强大的功能之一。组件可以扩展 HTML 元素,封装可重用的代码。这篇文章给大家介绍了vue组件的使用,需要的朋友参考下吧
    2018-01-01
  • elementUI实现级联选择器

    elementUI实现级联选择器

    这篇文章主要为大家详细介绍了elementUI实现级联选择器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • Vue 中如何利用 new Date() 获取当前时间

    Vue 中如何利用 new Date() 获取当前时间

    在 Vue 开发中,利用 new Date() 方法可以方便地获取当前时间,并通过 Date 对象的方法进行时间格式化和操作。通过本文的介绍,您应该对在 Vue 中获取当前时间有了更深入的了解,并了解了一些常见的时间操作方法,需要的朋友可以参考下
    2023-07-07
  • VUE开发分布式医疗挂号系统的医院设置页面步骤

    VUE开发分布式医疗挂号系统的医院设置页面步骤

    这篇文章主要为大家介绍了VUE开发分布式医疗挂号系统的医院设置页面步骤,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-04-04

最新评论