当前位置:首页 > VUE

vue组件的拖拽实现

2026-02-23 12:35:16VUE

Vue 组件拖拽实现方法

使用 HTML5 原生拖拽 API

HTML5 提供了原生的拖拽 API,可以通过 draggable 属性、dragstartdragenddragoverdrop 等事件实现拖拽功能。

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

<script>
export default {
  methods: {
    handleDragStart(e) {
      e.dataTransfer.setData('text/plain', 'drag-data');
    },
    handleDrop(e) {
      e.preventDefault();
      const data = e.dataTransfer.getData('text/plain');
      console.log('拖拽数据:', data);
    }
  }
}
</script>

使用第三方库 vue-draggable

vue-draggable 是基于 Sortable.js 的 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('拖拽结束,当前列表:', this.list);
    }
  }
}
</script>

使用自定义拖拽逻辑

对于更复杂的拖拽需求,可以通过自定义逻辑实现。例如,结合鼠标事件(mousedownmousemovemouseup)计算元素位置。

<template>
  <div 
    ref="dragElement"
    @mousedown="startDrag"
    :style="{ left: position.x + 'px', top: position.y + 'px' }"
  >
    可拖拽元素
  </div>
</template>

<script>
export default {
  data() {
    return {
      position: { x: 0, y: 0 },
      isDragging: false,
      startPos: { x: 0, y: 0 }
    };
  },
  methods: {
    startDrag(e) {
      this.isDragging = true;
      this.startPos = { x: e.clientX - this.position.x, y: e.clientY - this.position.y };
      document.addEventListener('mousemove', this.handleDrag);
      document.addEventListener('mouseup', this.stopDrag);
    },
    handleDrag(e) {
      if (this.isDragging) {
        this.position.x = e.clientX - this.startPos.x;
        this.position.y = e.clientY - this.startPos.y;
      }
    },
    stopDrag() {
      this.isDragging = false;
      document.removeEventListener('mousemove', this.handleDrag);
      document.removeEventListener('mouseup', this.stopDrag);
    }
  }
}
</script>

使用 Vue 指令实现拖拽

通过自定义指令封装拖拽逻辑,可以复用拖拽功能。

Vue.directive('drag', {
  bind(el, binding) {
    let isDragging = false;
    let startX, startY;

    el.addEventListener('mousedown', (e) => {
      isDragging = true;
      startX = e.clientX - el.getBoundingClientRect().left;
      startY = e.clientY - el.getBoundingClientRect().top;
      document.addEventListener('mousemove', move);
      document.addEventListener('mouseup', up);
    });

    function move(e) {
      if (isDragging) {
        el.style.left = `${e.clientX - startX}px`;
        el.style.top = `${e.clientY - startY}px`;
      }
    }

    function up() {
      isDragging = false;
      document.removeEventListener('mousemove', move);
      document.removeEventListener('mouseup', up);
    }
  }
});

使用指令:

vue组件的拖拽实现

<div v-drag style="position: absolute;">拖拽我</div>

注意事项

  • 拖拽元素需要设置 position: absoluteposition: relative 以确保定位生效。
  • 使用原生拖拽 API 时,注意阻止默认事件(如 dragoverpreventDefault)。
  • 第三方库(如 vue-draggable)更适合复杂场景,如列表排序或跨组件拖拽。
  • 移动端适配可能需要额外处理触摸事件(如 touchstarttouchmove)。

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

相关文章

vue实现carousel拖拽

vue实现carousel拖拽

Vue实现Carousel拖拽功能 实现一个支持拖拽的Carousel组件可以通过结合Vue的响应式特性和原生DOM事件来实现。以下是具体实现方法: 基础Carousel结构 创建一个基础的Caro…

vue组件的实现

vue组件的实现

Vue 组件的实现方式 Vue 组件可以通过多种方式实现,主要包括单文件组件(SFC)、全局注册和局部注册。以下是常见的实现方法: 单文件组件(SFC) 单文件组件是 Vue 最推荐的组件化开发方式…

vue实现递归组件

vue实现递归组件

递归组件的实现方法 在Vue中实现递归组件主要依靠组件调用自身的能力。以下是几种常见的实现方式: 使用组件name属性 通过组件的name属性实现递归调用是最简单的方式: <template…

vue能实现拖拽

vue能实现拖拽

Vue 实现拖拽的方法 Vue 可以通过多种方式实现拖拽功能,包括原生 HTML5 的拖拽 API、第三方库如 vuedraggable 或自定义指令。以下是几种常见的实现方式: 使用 HTML5…

vue 实现toast组件

vue 实现toast组件

实现 Vue Toast 组件的方法 创建基础 Toast 组件 在 Vue 项目中创建一个基础 Toast 组件,通常包含消息内容和显示控制逻辑。 <template> <d…

vue实现search组件

vue实现search组件

Vue 实现搜索组件 基础实现 创建一个基础的搜索组件需要包含输入框和搜索逻辑。以下是一个简单的实现示例: <template> <div class="search-cont…