当前位置:首页 > VUE

vue 拖拽排序 实现

2026-01-16 00:00:41VUE

实现拖拽排序的基本思路

在Vue中实现拖拽排序通常需要借助HTML5的拖放API或第三方库如sortablejsvuedraggable等。以下是两种常见实现方式:

使用HTML5原生拖放API

通过HTML5的draggable属性结合dragstartdragoverdrop等事件实现基础拖拽排序。

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

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

vuedraggable是基于sortablejs的Vue组件,提供更完善的拖拽功能。

安装依赖:

vue 拖拽排序 实现

npm install vuedraggable

示例代码:

<template>
  <draggable 
    v-model="list" 
    @end="onDragEnd"
    item-key="id"
  >
    <template #item="{ element }">
      <div>{{ 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' }
      ]
    }
  },
  methods: {
    onDragEnd() {
      console.log('排序后的列表:', this.list)
    }
  }
}
</script>

实现表格行拖拽排序

对于表格行的拖拽排序,vuedraggable同样适用:

vue 拖拽排序 实现

<template>
  <draggable 
    v-model="tableData" 
    tag="tbody"
    item-key="id"
  >
    <template #item="{ element }">
      <tr>
        <td>{{ element.id }}</td>
        <td>{{ element.name }}</td>
      </tr>
    </template>
  </draggable>
</template>

跨组件拖拽实现

通过Vue的provide/inject或全局状态管理实现跨组件拖拽:

// 父组件
provide() {
  return {
    dragContext: {
      list: this.list,
      updateList: this.updateList
    }
  }
}

// 子组件
inject: ['dragContext']

性能优化建议

对于大数据量列表,使用虚拟滚动技术(如vue-virtual-scroller)结合拖拽功能。限制重渲染范围,避免不必要的计算属性。

移动端适配

移动端需要添加touch事件支持。vuedraggable已内置移动端支持,原生实现需添加touchstarttouchmove等事件处理。

handleTouchStart(e, index) {
  this.draggedIndex = index
  this.touchStartY = e.touches[0].clientY
}

以上方法可根据具体需求选择实现,第三方库方案通常更完整但会增加包体积,原生API更适合简单场景。

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

相关文章

vue实现打印二维码

vue实现打印二维码

安装二维码生成库 使用 qrcode 或 vue-qrcode 库生成二维码。通过 npm 安装: npm install qrcode vue-qrcode 生成二维码 在 Vue 组件中引入…

vue实现逻辑

vue实现逻辑

Vue 实现逻辑的核心概念 Vue.js 是一个渐进式 JavaScript 框架,其核心逻辑围绕数据驱动和组件化开发。通过响应式系统、虚拟 DOM 和组件生命周期等机制,Vue 实现了高效的前端开发…

vue实现treeselect

vue实现treeselect

Vue TreeSelect 实现方法 使用 Vue 实现 TreeSelect 组件可以通过以下几种方式完成,包括使用现成的第三方库或自行封装组件。 使用第三方库 推荐使用成熟的第三方 TreeS…

vue实现keepalive

vue实现keepalive

Vue 中实现 keep-alive 在 Vue 中,keep-alive 是一个内置组件,用于缓存动态组件或组件的状态,避免重复渲染和销毁。以下是实现 keep-alive 的几种方法: 基本用法…

vue实现下拉实现

vue实现下拉实现

Vue 实现下拉菜单的方法 使用原生 HTML 和 Vue 指令 通过 Vue 的 v-model 和 v-show 指令可以快速实现下拉菜单。定义一个布尔值控制下拉菜单的显示与隐藏,点击按钮切换状态…

vue排他思想实现

vue排他思想实现

Vue 排他思想实现 排他思想在 Vue 中通常指多个元素中只能有一个被选中或激活的状态。可以通过数据驱动和条件渲染实现。 使用 v-model 和计算属性 定义一个数据属性存储当前选中项的索引或标…