当前位置:首页 > VUE

拖拽式编程vue实现

2026-02-25 19:07:30VUE

拖拽式编程在 Vue 中的实现方法

使用第三方库(如 vuedraggable

安装 vuedraggable 库:

npm install vuedraggable

在 Vue 组件中引入并使用:

拖拽式编程vue实现

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

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

原生 HTML5 拖拽 API 实现

通过 HTML5 的 draggable 属性和事件实现基础拖拽功能:

拖拽式编程vue实现

<template>
  <div 
    v-for="item in items" 
    :key="item.id"
    draggable="true"
    @dragstart="handleDragStart($event, item)"
    @dragover.prevent
    @drop="handleDrop($event, item)"
  >
    {{ item.name }}
  </div>
</template>

<script>
export default {
  data() {
    return {
      items: [
        { id: 1, name: 'Item 1' },
        { id: 2, name: 'Item 2' }
      ],
      draggedItem: null
    };
  },
  methods: {
    handleDragStart(event, item) {
      this.draggedItem = item;
      event.dataTransfer.effectAllowed = 'move';
    },
    handleDrop(event, targetItem) {
      if (this.draggedItem === targetItem) return;
      const draggedIndex = this.items.indexOf(this.draggedItem);
      const targetIndex = this.items.indexOf(targetItem);
      this.items.splice(draggedIndex, 1);
      this.items.splice(targetIndex, 0, this.draggedItem);
    }
  }
};
</script>

自定义指令实现

创建 Vue 自定义指令处理拖拽逻辑:

<template>
  <div v-draggable v-for="item in items" :key="item.id">
    {{ item.name }}
  </div>
</template>

<script>
export default {
  directives: {
    draggable: {
      inserted(el) {
        el.draggable = true;
        el.addEventListener('dragstart', (e) => {
          e.dataTransfer.setData('text/plain', el.textContent);
        });
      }
    }
  },
  data() {
    return {
      items: [
        { id: 1, name: 'Item 1' },
        { id: 2, name: 'Item 2' }
      ]
    };
  }
};
</script>

注意事项

  • 跨组件拖拽时需使用 group 属性(vuedraggable
  • 移动端兼容性需额外处理触摸事件
  • 复杂场景可结合 Vuex 管理拖拽状态
  • 性能优化:对于大量数据使用虚拟滚动

进阶功能示例

实现拖拽排序与位置交换:

<template>
  <div class="container">
    <div 
      v-for="(item, index) in items"
      :key="item.id"
      draggable="true"
      @dragstart="dragStart(index)"
      @dragover.prevent
      @dragenter="dragEnter(index)"
      @dragend="dragEnd"
      @drop="drop"
      :class="{ 'dragging': currentDragIndex === index }"
    >
      {{ item.name }}
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      items: [/* ... */],
      currentDragIndex: null,
      draggedIndex: null
    };
  },
  methods: {
    dragStart(index) {
      this.draggedIndex = index;
    },
    dragEnter(index) {
      this.currentDragIndex = index;
    },
    dragEnd() {
      this.currentDragIndex = null;
    },
    drop() {
      if (this.draggedIndex !== this.currentDragIndex) {
        const movedItem = this.items.splice(this.draggedIndex, 1)[0];
        this.items.splice(this.currentDragIndex, 0, movedItem);
      }
    }
  }
};
</script>

<style>
.dragging {
  opacity: 0.5;
  border: 2px dashed #ccc;
}
</style>

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

相关文章

vue实现单据

vue实现单据

Vue 实现单据功能的方法 使用 Vue 实现单据功能通常涉及表单设计、数据绑定、验证和提交等环节。以下是具体实现方案: 表单设计与数据绑定 使用 Vue 的 v-model 指令实现表单数据的双向…

vue实现flbook

vue实现flbook

Vue 实现类似 Flbook 的翻页效果 要实现类似 Flbook 的翻页效果,可以使用 Vue 结合 CSS 动画和 JavaScript 事件处理。以下是实现方法: 安装依赖 需要安装 vue…

vue拖动实现

vue拖动实现

实现 Vue 拖动功能的方法 使用 HTML5 拖放 API 在 Vue 中可以利用 HTML5 的原生拖放 API 实现拖动功能。通过 draggable 属性标记可拖动元素,结合 @dragsta…

vue实现select

vue实现select

Vue 实现 Select 组件的方法 在 Vue 中实现 Select 组件可以通过多种方式完成,以下是几种常见的方法: 使用原生 HTML select 元素 原生 HTML 的 <sel…

vue实现vr

vue实现vr

Vue 实现 VR 的方法 Vue 可以与 WebVR 或 WebXR API 结合使用,通过 Three.js、A-Frame 等库实现 VR 效果。以下是几种常见方法: 使用 A-Frame 框…

vue  实现分页

vue 实现分页

实现分页的基本思路 在Vue中实现分页通常需要结合后端API返回的数据和前端的分页组件。分页的核心逻辑包括计算总页数、处理当前页码变化以及触发数据请求。 分页组件示例 使用Element UI的分页…