You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vuedraggable如何实现两个可拖拽容器的元素位置互换

您好,我在使用Vuedraggable时遇到了问题:当我将「item 2」拖拽到「item 3」的位置时,希望两个元素能够互换位置,恳请各位帮忙提供解决方案。
拖拽场景示意

解决方案

Vuedraggable默认采用插入式排序逻辑,拖拽元素到目标位置后其他元素会顺移,要实现两个元素直接互换,需要关闭组件默认排序,手动在拖拽事件中处理数组元素交换。

完整实现代码

<template>
  <draggable
    v-model="list"
    :sort="false"
    @start="handleDragStart"
    @end="handleDragEnd"
    item-key="id"
  >
    <template #item="{ element }">
      <div class="drag-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' },
        { id: 4, name: 'item 4' }
      ],
      dragStartIndex: null
    }
  },
  methods: {
    handleDragStart(e) {
      // 记录拖拽起始元素下标
      this.dragStartIndex = e.oldIndex
    },
    handleDragEnd(e) {
      const startIdx = this.dragStartIndex
      const endIdx = e.newIndex
      // 位置无变化直接终止逻辑
      if (startIdx === endIdx || startIdx === null || endIdx === null) {
        this.dragStartIndex = null
        return
      }
      // 交换两个位置的数组元素
      ;[this.list[startIdx], this.list[endIdx]] = [this.list[endIdx], this.list[startIdx]]
      this.dragStartIndex = null
    }
  }
}
</script>

注意事项

  • :sort="false"是核心配置,必须关闭组件默认的排序逻辑,否则会出现元素位置错乱
  • item-key必须绑定唯一值,避免Vue节点复用导致的渲染异常
  • Vue3版本仅需调整为对应Composition API写法即可,核心交换逻辑无需修改

内容的提问来源于stack exchange,提问作者Maruko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 01:36:07