当前位置:首页 > 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;
}

进阶功能

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

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

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

注意事项

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

vue 实现div拖动排序

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

相关文章

vue实现查询替换

vue实现查询替换

Vue 实现查询替换功能 在 Vue 中实现查询替换功能,可以通过数据绑定和字符串操作方法结合实现。以下是具体实现方式: 基础实现 <template> <div>…

vue设计与实现 书

vue设计与实现 书

vue设计与实现 书 《Vue.js设计与实现》是一本深入探讨Vue.js框架内部原理和设计思想的书籍,适合希望深入理解Vue.js的开发者。以下是关于这本书的详细信息: 书籍内容 《Vue…

vue实现录音文件播放

vue实现录音文件播放

使用 Vue 实现录音文件播放 准备工作 确保项目中已安装必要的依赖,如 vue-audio-recorder 或原生 Web Audio API。录音文件播放通常涉及录音、存储和播放三个核心环节。…

vue实现双折线图

vue实现双折线图

实现双折线图的步骤 安装必要的依赖库(如 ECharts 或 Chart.js),这里以 ECharts 为例: npm install echarts --save 在 Vue 组件中引入 EC…

vue实现下拉刷新组件

vue实现下拉刷新组件

实现下拉刷新组件的核心思路 下拉刷新功能通常通过监听触摸事件、滚动位置和动画效果实现。Vue中可以利用自定义指令或封装组件完成,以下为两种常见实现方式。 基于自定义指令的实现 创建指令监听触摸事件…

vue实现一个标签选择

vue实现一个标签选择

Vue 标签选择组件实现 基础实现 使用 Vue 的 v-for 和 v-model 指令可以快速实现标签选择功能: <template> <div class="tag-se…