Vue 实现一个拖拽功能(指令)

发布时间 2023-11-23 14:38:25作者: joncky

用 Vue 实现一个拖拽功能,以指令的方式被调用。使用 Vue 的自定义指令(directive)来实现拖拽功能。一下是 Vue 代码示例:

<template>
  <div>
    <div v-draggable>拖拽我</div>
  </div>
</template>

<script>
export default {
  directives: {
    draggable: {
      mounted(el) {
        let isDragging = false;
        let offset = { x: 0, y: 0 };

        el.addEventListener("mousedown", handleMouseDown);
        el.addEventListener("mousemove", handleMouseMove);
        el.addEventListener("mouseup", handleMouseUp);

        function handleMouseDown(event) {
          isDragging = true;
          offset.x = event.offsetX;
          offset.y = event.offsetY;
        }

        function handleMouseMove(event) {
          if (!isDragging) return;

          const x = event.clientX - offset.x;
          const y = event.clientY - offset.y;

          el.style.left = x + "px";
          el.style.top = y + "px";
        }

        function handleMouseUp() {
          isDragging = false;
        }
      },
    },
  },
};
</script>

在上面的示例中,我们定义了一个名为 "draggable" 的自定义指令,并将其应用到需要支持拖拽的元素上。在指令的 mounted 钩子中,我们添加了鼠标事件监听器,从而实现了元素的拖拽功能。通过计算鼠标位置和初始偏移量,我们可以在鼠标移动的过程中更新元素的位置。