当前位置:首页 > 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组件,提供更完善的拖拽功能。

安装依赖:

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同样适用:

<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实现单页面

Vue 实现单页面应用(SPA) Vue.js 是一个渐进式框架,非常适合构建单页面应用(SPA)。SPA 的核心特点是整个应用只有一个 HTML 页面,通过动态加载内容实现页面切换,无需重新加载整个…

前端vue登录功能实现

前端vue登录功能实现

Vue 登录功能实现步骤 创建登录表单组件 在 Vue 项目中创建一个登录组件,通常命名为 Login.vue。该组件包含用户名和密码输入框以及提交按钮。 <template> &l…

vue搜索过后实现分页

vue搜索过后实现分页

Vue 实现搜索后分页功能 数据绑定与搜索逻辑 在 Vue 组件中定义必要的数据属性: data() { return { searchQuery: '', currentPag…

vue实现访问量

vue实现访问量

Vue 实现访问量统计的方法 使用前端计数 在 Vue 中可以通过简单的计数器实现页面访问量的统计。这种方法适合小型项目或演示用途。 // 在 Vue 组件中 data() { return {…

用vue实现搜索查询

用vue实现搜索查询

实现搜索查询的基本思路 在Vue中实现搜索查询功能通常涉及以下几个核心部分:数据绑定、事件监听、过滤逻辑和UI反馈。以下是一个完整的实现方案。 数据绑定与输入框 创建一个Vue组件,包含一个输入框…

vue实现下载暂停

vue实现下载暂停

Vue实现下载暂停功能 在Vue中实现下载暂停功能,通常需要结合XMLHttpRequest或Fetch API的AbortController来控制请求中断。以下是具体实现方法: 使用XMLH…