当前位置:首页 > VUE

用vue实现拖拽

2026-03-10 00:22:46VUE

使用 Vue 实现拖拽功能

在 Vue 中实现拖拽功能可以通过原生 HTML5 的拖拽 API 或第三方库如 vuedraggable 来完成。以下是两种方法的详细实现步骤。

原生 HTML5 拖拽 API 实现

原生拖拽 API 主要通过 draggable 属性、dragstartdragenddragoverdrop 事件实现。

用vue实现拖拽

<template>
  <div>
    <div 
      v-for="item in items" 
      :key="item.id"
      draggable="true"
      @dragstart="handleDragStart($event, item)"
      @dragend="handleDragEnd"
      class="draggable-item"
    >
      {{ item.text }}
    </div>
    <div 
      @dragover.prevent
      @drop="handleDrop"
      class="drop-zone"
    >
      拖拽到这里
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      items: [
        { id: 1, text: 'Item 1' },
        { id: 2, text: 'Item 2' },
        { id: 3, text: 'Item 3' }
      ],
      draggedItem: null
    };
  },
  methods: {
    handleDragStart(event, item) {
      this.draggedItem = item;
      event.dataTransfer.setData('text/plain', item.id);
    },
    handleDragEnd() {
      this.draggedItem = null;
    },
    handleDrop(event) {
      event.preventDefault();
      const itemId = event.dataTransfer.getData('text/plain');
      const item = this.items.find(item => item.id === parseInt(itemId));
      if (item) {
        // 处理拖拽逻辑,例如更新数组或触发状态变更
        console.log('Dropped item:', item);
      }
    }
  }
};
</script>

<style>
.draggable-item {
  padding: 8px;
  margin: 4px;
  background: #f0f0f0;
  cursor: move;
}
.drop-zone {
  padding: 20px;
  margin: 10px;
  background: #e0e0e0;
  border: 2px dashed #999;
}
</style>

使用 vuedraggable 库实现

vuedraggable 是一个基于 Sortable.js 的 Vue 拖拽组件,简化了列表拖拽的实现。

用vue实现拖拽

安装依赖:

npm install vuedraggable

示例代码:

<template>
  <div>
    <draggable 
      v-model="items" 
      @end="onDragEnd"
      item-key="id"
    >
      <template #item="{ element }">
        <div class="draggable-item">
          {{ element.text }}
        </div>
      </template>
    </draggable>
  </div>
</template>

<script>
import draggable from 'vuedraggable';
export default {
  components: { draggable },
  data() {
    return {
      items: [
        { id: 1, text: 'Item 1' },
        { id: 2, text: 'Item 2' },
        { id: 3, text: 'Item 3' }
      ]
    };
  },
  methods: {
    onDragEnd() {
      console.log('拖拽后的顺序:', this.items);
    }
  }
};
</script>

<style>
.draggable-item {
  padding: 8px;
  margin: 4px;
  background: #f0f0f0;
  cursor: move;
}
</style>

两种方法的对比

  • 原生 API:适合简单场景,无需额外依赖,但需要手动处理更多细节(如状态管理、样式控制)。
  • vuedraggable:功能强大,支持复杂拖拽逻辑(如跨列表拖拽、动画效果),适合需要快速实现的场景。

根据需求选择合适的方法即可。

标签: 拖拽vue
分享给朋友:

相关文章

vue前端实现打印功能

vue前端实现打印功能

使用Vue实现前端打印功能 在Vue项目中实现打印功能可以通过多种方式完成,以下是几种常见的方法: 使用window.print()方法 这是最简单的打印方式,直接调用浏览器的打印功能。 meth…

vue实现报表

vue实现报表

vue实现报表的方法 使用Vue实现报表通常需要结合图表库或表格组件。以下是几种常见方法: 使用ECharts 安装ECharts库: npm install echarts vue-echart…

vue实现公式

vue实现公式

在Vue中实现公式展示或计算可以通过多种方式实现,以下为具体方法: 使用模板插值与计算属性 若公式较简单,可直接在模板中使用插值表达式或计算属性。例如计算圆的面积: <template>…

vue实现portal

vue实现portal

Vue 实现 Portal 功能 Portal 是一种将子节点渲染到父组件 DOM 层级之外的 DOM 节点的技术,常用于实现模态框、弹出层等需要脱离当前组件层级的场景。Vue 可以通过多种方式实现…

vue实现复制

vue实现复制

Vue 实现复制功能 在 Vue 中实现复制功能可以通过多种方式完成,以下是几种常见的方法: 方法一:使用 Clipboard API Clipboard API 是现代浏览器提供的一种原生 AP…

vue 实现穿透

vue 实现穿透

Vue 样式穿透的实现方法 在 Vue 中,样式穿透通常指在带有 scoped 属性的样式块中,强制影响子组件的样式。以下是几种常见的实现方式: 使用 >>> 或 /deep/ 选…