当前位置:首页 > VUE

vue如何实现拖拽

2026-03-30 05:32:10VUE

Vue 实现拖拽的方法

使用 HTML5 原生拖拽 API

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

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

<script>
export default {
  methods: {
    handleDragStart(e) {
      e.dataTransfer.setData('text/plain', '拖拽数据');
    },
    handleDrop(e) {
      const data = e.dataTransfer.getData('text/plain');
      console.log('接收到的数据:', data);
    },
    handleDragEnd() {
      console.log('拖拽结束');
    }
  }
};
</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' },
        { id: 3, name: 'Item 3' }
      ]
    };
  },
  methods: {
    onDragEnd() {
      console.log('拖拽完成后的列表:', this.list);
    }
  }
};
</script>

使用自定义拖拽逻辑

通过鼠标事件(mousedownmousemovemouseup)实现自定义拖拽逻辑。

vue如何实现拖拽

<template>
  <div
    ref="dragElement"
    @mousedown="startDrag"
    :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;
      document.addEventListener('mousemove', this.onDrag);
      document.addEventListener('mouseup', this.stopDrag);
    },
    onDrag(e) {
      if (this.isDragging) {
        this.offsetX = e.clientX - this.startX;
        this.offsetY = e.clientY - this.startY;
      }
    },
    stopDrag() {
      this.isDragging = false;
      document.removeEventListener('mousemove', this.onDrag);
      document.removeEventListener('mouseup', this.stopDrag);
    }
  }
};
</script>

注意事项

  • 使用原生拖拽 API 时,需注意浏览器兼容性。
  • Vue.Draggable 适合列表类拖拽,功能更强大且易于集成。
  • 自定义拖拽逻辑灵活性高,但需要处理更多细节(如边界限制、性能优化)。

分享给朋友:

相关文章

vue如何实现confirm

vue如何实现confirm

Vue 实现 Confirm 弹窗的方法 在 Vue 中实现确认弹窗(Confirm)可以通过多种方式,以下是几种常见的方法: 使用浏览器原生 confirm 最简单的实现方式是直接调用浏览器的原生…

vue实现拖拽表格

vue实现拖拽表格

Vue 实现拖拽表格的方法 使用第三方库(推荐) 推荐使用 vuedraggable 或 sortablejs 这类成熟的拖拽库,它们对 Vue 有良好支持且功能丰富。 安装 vuedraggabl…

vue如何实现同步

vue如何实现同步

Vue 同步实现方法 在 Vue 中实现同步操作通常涉及处理异步任务(如 API 调用、定时器等)的同步化。以下是几种常见方法: 使用 async/await 通过 async/await 语法可以…

vue实现拖拽替换

vue实现拖拽替换

实现拖拽替换的基本思路 使用HTML5的拖放API结合Vue的响应式数据绑定,可以轻松实现元素的拖拽替换功能。核心是利用draggable属性、dragstart、dragover和drop事件。…

vue如何实现分页

vue如何实现分页

实现分页的基本思路 在Vue中实现分页通常需要结合后端API返回的分页数据和前端的分页组件。前端需要处理页码切换、数据请求和渲染逻辑。 后端API分页参数 后端API通常需要接收分页参数,例如pag…

vue实现拖拽图层

vue实现拖拽图层

Vue 实现拖拽图层的方法 使用原生 HTML5 拖拽 API HTML5 提供了原生的拖拽 API,可以通过 draggable 属性、dragstart、dragend、dragover 和 dr…