vue实现卡片拖拽
Vue 实现卡片拖拽的方法
使用 Vue 实现卡片拖拽功能可以通过原生 HTML5 的拖放 API 或第三方库如 vuedraggable 来实现。以下是两种常见的实现方式:
使用 HTML5 拖放 API
HTML5 提供了原生的拖放 API,可以通过 draggable 属性和相关事件实现拖拽功能。

<template>
<div class="container">
<div
v-for="(item, index) in items"
:key="index"
class="card"
draggable="true"
@dragstart="handleDragStart(index, $event)"
@dragover.prevent
@drop="handleDrop(index, $event)"
>
{{ item }}
</div>
</div>
</template>
<script>
export default {
data() {
return {
items: ['卡片1', '卡片2', '卡片3', '卡片4'],
draggedIndex: null
};
},
methods: {
handleDragStart(index, event) {
this.draggedIndex = index;
event.dataTransfer.setData('text/plain', index);
},
handleDrop(index, event) {
const draggedIndex = this.draggedIndex;
if (draggedIndex !== null && draggedIndex !== index) {
const newItems = [...this.items];
const [draggedItem] = newItems.splice(draggedIndex, 1);
newItems.splice(index, 0, draggedItem);
this.items = newItems;
}
}
}
};
</script>
<style>
.card {
padding: 10px;
margin: 5px;
background: #f0f0f0;
border: 1px solid #ccc;
cursor: move;
}
</style>
使用 vuedraggable 库
vuedraggable 是一个基于 Sortable.js 的 Vue 拖拽组件,提供了更简单的方式实现拖拽功能。
-
安装
vuedraggable:
npm install vuedraggable -
在 Vue 组件中使用:
<template> <div class="container"> <draggable v-model="items" group="cards" @start="dragStart" @end="dragEnd" > <div v-for="(item, index) in items" :key="index" class="card"> {{ item }} </div> </draggable> </div> </template>
export default { components: { draggable }, data() { return { items: ['卡片1', '卡片2', '卡片3', '卡片4'] }; }, methods: { dragStart() { console.log('拖拽开始'); }, dragEnd() { console.log('拖拽结束'); } } };
.card { padding: 10px; margin: 5px; background: #f0f0f0; border: 1px solid #ccc; cursor: move; } ```注意事项
- 性能优化:如果卡片数量较多,建议使用虚拟滚动(如
vue-virtual-scroller)避免性能问题。 - 跨组件拖拽:
vuedraggable的group属性可以实现跨组件的拖拽功能。 - 移动端支持:HTML5 拖放 API 在移动端支持较差,建议使用
vuedraggable或触摸事件库(如hammer.js)。






