当前位置:首页 > 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 实现思路 核心是数据劫持结合发布-订阅模式,通过 Object.defineProperty 或 Proxy 监听数据变化,触发视图更新。 数据劫持实现 class Observer…

vue实现预约页面

vue实现预约页面

Vue 预约页面实现步骤 准备工作 安装Vue CLI创建项目,确保已配置好开发环境。使用vue create appointment-page初始化项目,选择默认配置或手动配置。 页面结构设计…

vue前端实现登录

vue前端实现登录

实现登录功能的基本流程 使用Vue实现登录功能需要结合前端框架和后端API交互。以下是一个典型的实现方案: 安装必要依赖 确保项目已安装axios用于HTTP请求: npm install a…

js实现vue

js实现vue

Vue.js 的基本实现方法 在 JavaScript 中实现 Vue.js 的功能,可以通过直接引入 Vue 库或使用现代构建工具(如 Vite 或 Webpack)。以下是几种常见的实现方式:…

vue 实现toast

vue 实现toast

vue 实现 toast 的方法 在 Vue 中实现 Toast 提示功能可以通过多种方式,以下是几种常见的实现方法: 使用第三方库 Vue 生态中有许多成熟的 Toast 库,例如 vue-toa…

vue实现过滤

vue实现过滤

Vue实现过滤的方法 在Vue中实现数据过滤可以通过多种方式完成,以下是几种常见的方法: 使用计算属性过滤 计算属性是Vue中处理数据过滤的理想选择,它们基于响应式依赖进行缓存,只有在相关依赖发生改…