当前位置:首页 > 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 组件是 Vue.js 的核心特性之一,允许将 UI 拆分为独立、可复用的模块。以下是实现 Vue 组件的几种方式: 单文件组件 (SFC) 使用 .vue 文件格式,…

vue实现框架

vue实现框架

Vue 框架实现的核心方法 基础项目搭建 使用 Vue CLI 或 Vite 快速初始化项目。Vue CLI 适合传统项目,Vite 更适合现代轻量级应用。安装后通过命令行工具选择所需配置(如 Rou…

vue实现换行

vue实现换行

Vue 中实现换行的几种方法 在 Vue 中实现换行可以通过多种方式,具体取决于使用场景和需求。以下是常见的几种方法: 使用 HTML 的 <br> 标签 在模板中直接使用 <br…

vue实现列表

vue实现列表

Vue 实现列表的方法 在 Vue 中实现列表渲染通常使用 v-for 指令,可以动态生成多个元素。以下是几种常见的实现方式: 基础列表渲染 使用 v-for 遍历数组,生成列表项。v-for 需要…

vue sku 实现

vue sku 实现

Vue SKU 实现方案 在电商系统中,SKU(Stock Keeping Unit)是商品的最小库存单位,通常由多个属性组合而成(如颜色、尺寸等)。以下是基于 Vue 的实现方案。 数据结构设计…

vue select实现搜索

vue select实现搜索

实现 Vue Select 搜索功能的方法 在 Vue 中实现 select 组件的搜索功能,可以通过原生 HTML select 结合自定义搜索逻辑,或使用第三方库如 vue-select 来实现。…