当前位置:首页 > VUE

vue实现组件拖拽

2026-02-20 08:47:58VUE

Vue 实现组件拖拽的方法

使用 HTML5 原生拖拽 API

HTML5 提供了原生拖拽 API,可以通过 draggable 属性和相关事件实现拖拽功能。

<template>
  <div
    draggable="true"
    @dragstart="handleDragStart"
    @dragend="handleDragEnd"
    @dragover.prevent
    @drop="handleDrop"
  >
    拖拽元素
  </div>
</template>

<script>
export default {
  methods: {
    handleDragStart(e) {
      e.dataTransfer.setData('text/plain', e.target.id);
    },
    handleDragEnd(e) {
      // 拖拽结束处理
    },
    handleDrop(e) {
      e.preventDefault();
      const data = e.dataTransfer.getData('text/plain');
      const draggedElement = document.getElementById(data);
      e.target.appendChild(draggedElement);
    }
  }
};
</script>

使用第三方库 Vue.Draggable

Vue.Draggable 是一个基于 Sortable.js 的 Vue 拖拽组件库,适合列表排序和复杂拖拽场景。

安装:

vue实现组件拖拽

npm install vuedraggable

使用示例:

<template>
  <draggable v-model="list" @end="onDragEnd">
    <div v-for="item in list" :key="item.id">
      {{ item.name }}
    </div>
  </draggable>
</template>

<script>
import draggable from 'vuedraggable';

export default {
  components: { draggable },
  data() {
    return {
      list: [
        { id: 1, name: 'Item 1' },
        { id: 2, name: 'Item 2' }
      ]
    };
  },
  methods: {
    onDragEnd() {
      console.log('拖拽完成');
    }
  }
};
</script>

使用自定义拖拽逻辑

对于更复杂的拖拽需求,可以结合鼠标事件实现自定义拖拽逻辑。

vue实现组件拖拽

<template>
  <div
    ref="dragElement"
    @mousedown="startDrag"
    @mousemove="onDrag"
    @mouseup="stopDrag"
    :style="dragStyle"
  >
    自定义拖拽元素
  </div>
</template>

<script>
export default {
  data() {
    return {
      isDragging: false,
      startX: 0,
      startY: 0,
      offsetX: 0,
      offsetY: 0
    };
  },
  computed: {
    dragStyle() {
      return {
        position: 'absolute',
        left: `${this.offsetX}px`,
        top: `${this.offsetY}px`,
        cursor: this.isDragging ? 'grabbing' : 'grab'
      };
    }
  },
  methods: {
    startDrag(e) {
      this.isDragging = true;
      this.startX = e.clientX;
      this.startY = e.clientY;
    },
    onDrag(e) {
      if (!this.isDragging) return;
      this.offsetX = e.clientX - this.startX;
      this.offsetY = e.clientY - this.startY;
    },
    stopDrag() {
      this.isDragging = false;
    }
  }
};
</script>

拖拽边界限制

为了防止元素被拖出可视区域,可以添加边界检查逻辑。

onDrag(e) {
  if (!this.isDragging) return;

  const newX = e.clientX - this.startX;
  const newY = e.clientY - this.startY;

  const maxX = window.innerWidth - this.$refs.dragElement.offsetWidth;
  const maxY = window.innerHeight - this.$refs.dragElement.offsetHeight;

  this.offsetX = Math.max(0, Math.min(newX, maxX));
  this.offsetY = Math.max(0, Math.min(newY, maxY));
}

拖拽放置区域高亮

在拖拽过程中高亮可能的放置区域,提升用户体验。

<template>
  <div
    @dragover="highlightDropZone"
    @dragleave="unhighlightDropZone"
    @drop="handleDrop"
    :class="{ 'highlight': isHighlighted }"
  >
    放置区域
  </div>
</template>

<script>
export default {
  data() {
    return {
      isHighlighted: false
    };
  },
  methods: {
    highlightDropZone() {
      this.isHighlighted = true;
    },
    unhighlightDropZone() {
      this.isHighlighted = false;
    }
  }
};
</script>

<style>
.highlight {
  border: 2px dashed #42b983;
  background-color: rgba(66, 185, 131, 0.1);
}
</style>

标签: 组件拖拽
分享给朋友:

相关文章

vue实现图标拖拽

vue实现图标拖拽

Vue 实现图标拖拽 使用 HTML5 拖放 API 在 Vue 中实现图标拖拽可以利用 HTML5 的拖放 API。通过 draggable 属性标记可拖拽元素,并监听 dragstart、drag…

uniapp倒计时组件

uniapp倒计时组件

uniapp倒计时组件实现方法 使用内置组件实现 uniapp提供了<countdown>组件用于倒计时功能,支持自定义格式和样式。示例代码如下: <countdown…

vue实现组件

vue实现组件

Vue 实现组件的方法 Vue 中实现组件可以通过多种方式,包括全局注册、局部注册、单文件组件(SFC)等。以下是常见的实现方法。 全局注册组件 全局注册的组件可以在任何 Vue 实例或组件中使用。…

vue实现广告组件

vue实现广告组件

vue实现广告组件的方法 使用动态组件实现 在Vue中可以通过动态组件的方式加载广告组件,根据不同的条件展示不同的广告内容。动态组件使用<component :is="currentCompon…

vue实现拖拽连接

vue实现拖拽连接

Vue 实现拖拽连接功能 在 Vue 中实现拖拽连接功能通常涉及使用 HTML5 的拖放 API 或第三方库(如 vuedraggable)。以下是两种常见实现方式: 使用 HTML5 拖放 API…

vue实现折叠组件

vue实现折叠组件

实现折叠组件的基本思路 在Vue中实现折叠组件通常需要利用动态绑定和条件渲染。核心是通过控制一个布尔值状态来决定内容是否显示,并添加过渡动画提升用户体验。 基础实现方法 使用v-show或v-if控…