当前位置:首页 > 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实现适老化样式

Vue 实现适老化样式的关键方法 全局字体与字号调整 通过 CSS 变量或主题配置统一放大基础字号,建议正文不小于 18px,标题更大。在 App.vue 中设置全局样式: :root { --…

vue手写签名如何实现

vue手写签名如何实现

实现手写签名的基本思路 在Vue中实现手写签名功能,通常需要借助HTML5的Canvas API来捕获用户的绘制操作。核心流程包括初始化画布、监听触摸/鼠标事件、记录轨迹以及生成签名图片。 安装依…

vue实现微博发布动态

vue实现微博发布动态

使用Vue实现微博发布动态功能 创建Vue组件结构 新建一个WeiboPost.vue组件,包含文本框、图片上传和发布按钮: <template> <div class="we…

vue实现倒计时抢券

vue实现倒计时抢券

Vue 实现倒计时抢券功能 核心逻辑 倒计时抢券功能需要结合时间计算、状态管理和界面交互。通过 Vue 的响应式特性和生命周期钩子,可以高效实现这一需求。 实现步骤 1. 数据准备 在 Vue 组件…

vue实现store

vue实现store

Vue 实现 Store 在 Vue 中,可以通过 Vuex 或 Pinia 实现全局状态管理(Store)。以下是两种主流方案的实现方法。 使用 Vuex 实现 Store Vuex 是 Vu…

vue 动画 实现

vue 动画 实现

vue 动画实现方法 Vue 提供了多种方式实现动画效果,主要包括过渡动画和动态动画两类。 使用 <transition> 组件实现基础过渡 通过 Vue 内置的 <transit…