Vue.js拖拽排序组件vuedraggable使用详解

2026-07-29 19:00:13 79 次阅读

Vue开发中,列表数据的交互体验往往决定了产品的易用性,而拖拽排序正是其中使用频率非常高的能力之一。在管理后台、任务看板、图片排序、菜单配置等场景中,手动调整顺序如果没有拖拽支持,会显得非常低效。Vue生态中最成熟的解决方案之一就是基于 SortableJS 封装的 vuedraggable,它能够让拖拽排序在 Vue 中变得几乎零成本接入。

在实际项目中,很多开发者会同时使用 Vue2 和 Vue3,因此需要先明确 vuedraggable 的版本差异。Vue2 通常使用 vuedraggable@2,而 Vue3 对应的是基于 SortableJS 重构后的 vuedraggable@next,两者在组件写法上略有不同,但核心逻辑一致。


一、vuedraggable 的核心原理

vuedraggable 本质上是对 SortableJS 的 Vue 封装,通过监听 DOM 拖拽事件,自动更新绑定的数组数据。

它的核心思想很简单:

  • 拖拽的是 DOM

  • 更新的是数组

  • Vue 负责响应式渲染

因此无需手动操作 DOM,也不需要额外计算位置。


二、基础使用方式(Vue3)

安装依赖:

Bash
npm install vuedraggable@next sortablejs

基础示例:

vue

v-model="list" item-key="id">
#item="{ element }">
class="item">
{{ element.name }}





setup>
import { ref } from "vue"
import draggable from "vuedraggable"

const list = ref([
{ id: 1, name: "任务A" },
{ id: 2, name: "任务B" },
{ id: 3, name: "任务C" }
])

这一段代码已经实现了完整的拖拽排序能力,不需要额外逻辑。


三、Vue2中的写法差异

Vue2 使用方式略有不同:

vue

v-model="list" :options="options">
v-for="item in list" :key="item.id">
{{ item.name }}





import draggable from "vuedraggable"

export default {
components: { draggable },
data() {
return {
list: [],
options: {
animation: 150
}
}
}
}

Vue2 版本更依赖 options 配置,而 Vue3 更偏向 props 化设计。


四、常用配置参数解析

vuedraggable 提供了丰富的配置能力,常用参数包括:

示例:

vue

v-model="list"
item-key="id"
:animation="200"
ghost-class="ghost"
chosen-class="chosen"
>

合理使用这些配置可以显著提升用户体验。


五、分组拖拽(跨列表拖动)

在电商后台或任务管理系统中,经常需要实现“跨列表拖拽”。

vue
 v-model="todo" group="task" />
v-model="done" group="task" />

只要 group 相同,两个列表之间的数据就可以自由拖动。


六、禁止拖拽与权限控制

实际项目中,拖拽往往需要权限控制,例如管理员才能调整顺序。

vue
 :disabled="!isAdmin" v-model="list" />

也可以对单个元素设置不可拖拽:

HTML
 class="item" :data-id="item.id" :draggable="false">

七、拖拽后数据持久化

拖拽完成后,数组顺序已经变化,但通常需要同步到后端。

JavaScript
function onEnd() {
saveListOrder(list.value)
}

也可以监听 change 事件:

vue
 v-model="list" @change="onChange" />

后端一般只需要接收 id 顺序数组即可。


八、常见问题与优化方案

1. 拖拽卡顿

通常是列表过大导致 DOM 渲染压力过高,可以考虑:


2. key 设置错误

必须使用唯一 id,否则会出现错位问题。

HTML
item-key="id"

3. 嵌套拖拽冲突

多个 draggable 嵌套时,需要合理设置 handle:

vue
 handle=".handle" />

九、进阶应用:看板系统实现

在任务看板(类似 Trello)中,vuedraggable 是核心技术之一:

结合接口同步,可以快速实现完整看板系统。


十、性能优化建议

在大数据场景下建议:


vuedraggable 的价值在于,它把复杂的拖拽交互封装成声明式组件,让开发者只需要关注数据结构,而不是 DOM 操作逻辑。在 Vue 体系中,它几乎是实现拖拽排序的标准方案。