vue 拖拽排序 实现
实现拖拽排序的基本思路
在Vue中实现拖拽排序通常需要借助HTML5的Drag and Drop API或第三方库如vuedraggable。以下是两种常见方法的实现步骤。
使用HTML5原生API实现
通过HTML5的draggable属性结合@dragstart、@dragover和@drop事件实现基础拖拽排序功能。

<template>
<ul>
<li
v-for="(item, index) in list"
:key="item.id"
draggable="true"
@dragstart="handleDragStart(index)"
@dragover.prevent="handleDragOver(index)"
@drop="handleDrop(index)"
>
{{ item.name }}
</li>
</ul>
</template>
<script>
export default {
data() {
return {
list: [
{ id: 1, name: 'Item 1' },
{ id: 2, name: 'Item 2' },
{ id: 3, name: 'Item 3' }
],
draggedIndex: null
}
},
methods: {
handleDragStart(index) {
this.draggedIndex = index
},
handleDragOver(index) {
if (this.draggedIndex !== index) {
const draggedItem = this.list[this.draggedIndex]
this.list.splice(this.draggedIndex, 1)
this.list.splice(index, 0, draggedItem)
this.draggedIndex = index
}
},
handleDrop() {
this.draggedIndex = null
}
}
}
</script>
使用vuedraggable库
vuedraggable是基于Sortable.js的Vue组件,提供更丰富的功能和更好的兼容性。
安装依赖:

npm install vuedraggable
示例代码:
<template>
<draggable
v-model="list"
@end="onDragEnd"
item-key="id"
>
<template #item="{ element }">
<div class="item">{{ element.name }}</div>
</template>
</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>
<style>
.item {
padding: 10px;
margin: 5px;
background: #f0f0f0;
cursor: move;
}
</style>
进阶功能实现
对于更复杂的需求,可以结合动画和状态管理:
<template>
<draggable
v-model="list"
animation="200"
handle=".handle"
ghost-class="ghost"
>
<template #item="{ element }">
<div class="item">
<span class="handle">≡</span>
{{ element.name }}
</div>
</template>
</draggable>
</template>
<style>
.ghost {
opacity: 0.5;
background: #c8ebfb;
}
.handle {
cursor: move;
margin-right: 10px;
}
</style>
注意事项
- 移动端兼容性需要额外处理触摸事件
- 复杂数据结构可能需要深度监听
- 性能优化对于大型列表很重要
- 拖拽状态需要合理管理以避免闪烁
以上方法可根据实际项目需求选择使用,vuedraggable提供了更完整的解决方案,适合大多数生产环境。






