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实现实时搜索显示功能

    vue实现实时搜索显示功能

    这篇文章主要为大家详细介绍了vue实现实时搜索显示功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • Vue组件之非单文件组件的使用详解

    Vue组件之非单文件组件的使用详解

    Vue中常常会把组件分为非单文件组件和单文件组件,这篇文章主要为大家介绍了非单文件组件的具体使用方法,文中的示例代码讲解详细,需要的可以参考一下
    2023-05-05
  • 利用vue3自己实现计数功能组件封装实例

    利用vue3自己实现计数功能组件封装实例

    组件(Component) 是Vue.js最强大的功能之一,组件可以扩展 HTML 元素,封装可重用的代码,这篇文章主要给大家介绍了关于利用vue3自己实现计数功能组件封装的相关资料,需要的朋友可以参考下
    2021-09-09
  • el-table 选中行与复选框相互联动的实现步骤

    el-table 选中行与复选框相互联动的实现步骤

    这篇文章主要介绍了el-table 选中行与复选框相互联动,分为两步,第一步点击行时触发复选框的选择或取消,第二步点击复选框时触发相应行的变化,本文通过实例代码给大家详细讲解,需要的朋友可以参考下
    2022-10-10
  • Vue3中使用reactive时,后端有返回数据但dom没有更新的解决

    Vue3中使用reactive时,后端有返回数据但dom没有更新的解决

    这篇文章主要介绍了Vue3中使用reactive时,后端有返回数据但dom没有更新的解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • vue2组件之select2调用的示例代码

    vue2组件之select2调用的示例代码

    本篇文章主要介绍了vue2组件之select2调用的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • vue-router的导航守卫使用最新讲解

    vue-router的导航守卫使用最新讲解

    这篇文章主要介绍了vue-router的导航守卫使用讲解,vue-router提供了许多编程式导航的API,其中最常见的导航API有很多种,本文给大家详细讲解,需要的朋友可以参考下
    2022-12-12
  • 如何将百度地图包装成Vue的组件的方法步骤

    如何将百度地图包装成Vue的组件的方法步骤

    这篇文章主要介绍了如何将百度地图包装成Vue的组件的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-02-02
  • vue实现树形结构增删改查的示例代码

    vue实现树形结构增删改查的示例代码

    其实很多公司都会有类似于用户权限树的增删改查功能,本文主要介绍了vue实现树形结构增删改查,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • 配置vite.confgi.ts无法使用require问题以及解决

    配置vite.confgi.ts无法使用require问题以及解决

    这篇文章主要介绍了配置vite.confgi.ts无法使用require问题以及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05

最新评论