当前位置:首页 > VUE

vue 实现div拖动排序

2026-01-23 04:58:16VUE

实现原理

通过HTML5的拖放API(Drag and Drop)结合Vue的数据绑定特性实现。主要利用draggable属性、dragstartdragoverdrop等事件完成元素位置交换。

基础实现步骤

安装依赖(如需要)

npm install vuedraggable

使用原生HTML5 API实现

<template>
  <div 
    v-for="(item, index) in list" 
    :key="item.id"
    draggable="true"
    @dragstart="handleDragStart(index)"
    @dragover.prevent="handleDragOver(index)"
    @drop="handleDrop(index)"
  >
    {{ item.text }}
  </div>
</template>

<script>
export default {
  data() {
    return {
      list: [
        { id: 1, text: 'Item 1' },
        { id: 2, text: 'Item 2' },
        { id: 3, text: '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库

更简单的实现方式:

<template>
  <draggable 
    v-model="list" 
    @end="onDragEnd"
  >
    <div v-for="item in list" :key="item.id">
      {{ item.text }}
    </div>
  </draggable>
</template>

<script>
import draggable from 'vuedraggable'

export default {
  components: { draggable },
  data() {
    return {
      list: [
        { id: 1, text: 'Item 1' },
        { id: 2, text: 'Item 2' },
        { id: 3, text: 'Item 3' }
      ]
    }
  },
  methods: {
    onDragEnd() {
      console.log('排序完成', this.list)
    }
  }
}
</script>

样式优化

添加拖拽时的视觉反馈:

[draggable="true"] {
  cursor: move;
  user-select: none;
}

.drag-over {
  border: 2px dashed #000;
}

.ghost {
  opacity: 0.5;
  background: #c8ebfb;
}

进阶功能

实现跨容器拖拽(多个列表间排序):

vue 实现div拖动排序

<draggable 
  v-model="listA" 
  group="shared" 
  @change="log"
>
  <!-- 列表A内容 -->
</draggable>

<draggable 
  v-model="listB" 
  group="shared" 
  @change="log"
>
  <!-- 列表B内容 -->
</draggable>

注意事项

  • 移动端需要额外处理touch事件
  • 复杂数据结构需要深拷贝避免直接修改
  • 大型列表建议使用虚拟滚动优化性能
  • 拖拽动画可以使用transition-group增强体验

标签: 拖动vue
分享给朋友:

相关文章

vue实现异步

vue实现异步

Vue 实现异步操作的常见方法 Vue 提供了多种方式来处理异步操作,包括数据获取、事件处理等场景。 使用 async/await 在 Vue 方法中可以直接使用 async/await 语法处理异…

vue实现suspense

vue实现suspense

Vue 3 中实现 Suspense Suspense 是 Vue 3 引入的一个内置组件,用于处理异步依赖的加载状态。它允许在等待异步组件或异步数据加载时显示一个后备内容(fallback),直到异…

vue实现长按

vue实现长按

Vue 实现长按功能的方法 在 Vue 中实现长按功能可以通过原生事件监听或自定义指令完成。以下是几种常见实现方式: 使用原生事件监听 通过 @mousedown 和 @mouseup 或 @tou…

vue实现mouseout

vue实现mouseout

Vue 实现 mouseout 事件的方法 在 Vue 中实现 mouseout 事件可以通过多种方式完成,以下是几种常见的方法: 使用 v-on 指令 Vue 提供了 v-on 指令(或简写为 @…

vue 实现遮罩

vue 实现遮罩

Vue 实现遮罩层的方法 使用固定定位和透明背景 在Vue中实现遮罩层可以通过CSS固定定位结合透明背景色完成。创建一个全屏遮罩组件,利用position: fixed覆盖整个视窗。 <tem…

vue实现多选

vue实现多选

Vue 实现多选功能 在 Vue 中实现多选功能可以通过多种方式完成,以下是常见的几种方法: 使用 v-model 绑定数组 通过 v-model 绑定到一个数组,可以实现多选功能。适用于复选框组(…