Vue3使用vuedraggable实现拖拽排序功能实例代码

 更新时间:2026年02月11日 10:17:21   作者:琦遇  
vuedraggable是一个基于Sortable.js的Vue.js拖拽排序插件,提供简单、灵活且强大的拖拽功能,支持Vue2和Vue3,这篇文章主要介绍了Vue3使用vuedraggable实现拖拽排序功能的相关资料,需要的朋友可以参考下

安装依赖

npm install vuedraggable@next

引入组件

import draggable from 'vuedraggable'

基础用法

<template>
    <draggable v-model="innerList" item-key="props" handle=".sort-icon" :disabled="false" :animation="300">
        <template #item="{ element }">
            <div class="flexAlign">
                <div class="sort-icon" style="margin-right: 5px;cursor: pointer;font-size: 18px;">⠿</div>
                {{ element.label }}
            </div>
        </template>
    </draggable>
</template>

<script setup>
    import draggable from 'vuedraggable';
    const innerList = ref([
        {label:"名称"}
    ])
</script>

常用属性说明

属性名类型说明
v-modelArray绑定数组,拖拽后自动更新顺序
item-keyString每个 item 的唯一 key
tagString渲染的容器标签,默认div
groupString/Object分组设置,支持跨列表拖拽
disabledBoolean是否禁用拖拽
handleString拖拽手柄选择器
animationNumber拖拽的动画过渡时间

事件名

事件名说明参数
@start拖拽开始event
@end拖拽完成event
@change列表顺序发生变化{ moved: { oldIndex, newIndex } }
@add从别的列表添加到当前event
@remove当前列表被移除元素event

实战进阶场景

拖拽手柄限制(只能通过图标拖动)

<draggable v-model="list" item-key="id" handle=".sort-icon">
  <template #item="{ element }">
    <div>
      <span class="sort-icon">⠿</span>
      {{ element.name }}
    </div>
  </template>
</draggable>

禁用某项拖动

<draggable v-model="list" item-key="id" :move="checkMove" @change="logChange">
</draggable>

<script setup>
const checkMove = (e) => {
  return !e.draggedContext.element.fixed
}
const logChange = (e) => console.log(e)
</script>

跨列表拖拽

<draggable v-model="list1" item-key="id" group="all">
  ...
</draggable>

<draggable v-model="list2" item-key="id" group="all">
  ...
</draggable>

也可以使用对象方式更灵活控制:

group="{ name: 'all', pull: true, put: true }"

嵌套拖拽(如树形结构)

<draggable v-model="tabList" item-key="id">
  <template #item="{ element }">
    <div>{{ element.name }}</div>
    <draggable
      v-if="element.children"
      v-model="element.children"
      item-key="id"
      :group="{ name: 'all' }"
    >
      <template #item="{ element }">
        <div class="child">{{ element.name }}</div>
      </template>
    </draggable>
  </template>
</draggable>

示例:拖拽后保存顺序

<el-button @click="save">保存顺序</el-button>
<draggable v-model="list" item-key="id" @end="save" />

<script setup>
const save = () => {
  console.log('新顺序:', list.value.map(i => i.id))
}
</script>

常见问题排查

  1. 拖不动?

    • 是否设置了 item-key
    • 是否被 CSS 覆盖了事件(例如 overflow、position)
    • 是否启用了 disabled​ 属性
  2. 拖动异常(闪烁/跳动)?

    • 确保子项具有稳定的 key
    • 不要在拖拽中操作 DOM
  3. 样式塌陷?

    • 添加必要的 min-height​、border​ 保持布局正常

总结 

到此这篇关于Vue3使用vuedraggable实现拖拽排序功能的文章就介绍到这了,更多相关Vue3 vuedraggable拖拽排序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue实现PC端录音功能的实例代码

    vue实现PC端录音功能的实例代码

    这篇文章主要介绍了vue实现PC端录音功能的实例代码,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-06-06
  • 详解如何实现在Vue中导入Excel文件

    详解如何实现在Vue中导入Excel文件

    这篇文章主要介绍了如何在Vue中导入Excel文件,文中的示例代码讲解详细,对我们学习或工作有一定帮助,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-01-01
  • vue.js学习笔记之v-bind和v-on解析

    vue.js学习笔记之v-bind和v-on解析

    这篇文章主要介绍了vue.js学习笔记之v-bind和v-on解析,v-bind 指令用于响应地更新 HTML 特征,v-on 指令用于监听DOM事件,文中还给大家提到了v-bind,v-on的缩写,感兴趣的朋友参考下吧
    2018-05-05
  • vue使用smooth-signature实现移动端横竖屏电子签字

    vue使用smooth-signature实现移动端横竖屏电子签字

    这篇文章主要为大家介绍了vue使用smooth-signature实现移动端横竖屏电子签字示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • 详解Vue如何实现自定义动画与动画效果设计

    详解Vue如何实现自定义动画与动画效果设计

    在Vue中,动画效果是非常有用的,它可以使用户界面变得更加生动、有趣,本文中我们将学习如何在Vue中进行自定义动画与动画效果设计,感兴趣的可以了解一下
    2023-06-06
  • Vue.set()动态的新增与修改数据,触发视图更新的方法

    Vue.set()动态的新增与修改数据,触发视图更新的方法

    今天小编就为大家分享一篇Vue.set()动态的新增与修改数据,触发视图更新的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-09-09
  • vue导出excel多层表头的实现方案详解

    vue导出excel多层表头的实现方案详解

    这篇文章主要为大家详细介绍了vue导出excel多层表头的实现方案,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以跟随小编一起学习一下
    2025-04-04
  • vue中提示$index is not defined错误的解决方式

    vue中提示$index is not defined错误的解决方式

    这篇文章主要介绍了vue中提示$index is not defined错误的解决方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • vuex+axios+element-ui实现页面请求loading操作示例

    vuex+axios+element-ui实现页面请求loading操作示例

    这篇文章主要介绍了vuex+axios+element-ui实现页面请求loading操作,结合实例形式分析了vuex+axios+element-ui实现页面请求过程中loading遮罩层相关操作技巧与使用注意事项,需要的朋友可以参考下
    2020-02-02
  • vue 搭建后台系统模块化开发详解

    vue 搭建后台系统模块化开发详解

    这篇文章主要介绍了vue 搭建后台系统模块化开发详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-05-05

最新评论