当前位置:首页 > 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 拖拽组件库,适合实现列表排序、拖拽等功能。

安装:

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)计算元素位置。

vue组件的拖拽实现

<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);
    }
  }
});

使用指令:

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

注意事项

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

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

相关文章

vue实现图标拖拽

vue实现图标拖拽

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

vue实现拖拽

vue实现拖拽

Vue 实现拖拽功能的方法 使用 HTML5 原生拖拽 API HTML5 提供了原生的拖拽 API,可以通过 draggable 属性和相关事件实现拖拽功能。在 Vue 中可以通过绑定这些事件来实现…

Vue组件实现方法

Vue组件实现方法

Vue组件的基本实现 Vue组件是Vue.js的核心概念之一,允许将UI拆分为独立可复用的代码片段。组件的实现方式有多种,以下是常见的几种方法。 单文件组件(SFC) 单文件组件以.vue为后缀,将…

vue实现父子组件

vue实现父子组件

Vue 父子组件通信实现方式 1. 父组件向子组件传递数据(Props) 父组件通过 props 向子组件传递数据,子组件通过 props 接收数据。 父组件模板: <template>…

vue实现分页组件

vue实现分页组件

Vue 分页组件实现 基础分页组件结构 创建一个名为 Pagination.vue 的文件,包含以下基础模板和逻辑: <template> <div class="pa…

vue 实现弹窗组件

vue 实现弹窗组件

Vue 弹窗组件实现 基础弹窗组件结构 创建一个名为Modal.vue的文件,定义弹窗的基础结构和样式: <template> <div class="modal-mask"…