当前位置:首页 > VUE

vue实现列拖拽

2026-03-30 04:37:23VUE

Vue 实现列拖拽的方法

使用 Vue.Draggable 库

Vue.Draggable 是一个基于 Sortable.js 的 Vue 组件,适用于列表拖拽排序。安装方式如下:

npm install vuedraggable

基本用法示例:

vue实现列拖拽

<template>
  <draggable v-model="list" @end="onDragEnd">
    <div v-for="item in list" :key="item.id">{{ item.name }}</div>
  </draggable>
</template>

<script>
import draggable from 'vuedraggable'
export default {
  components: { draggable },
  data() {
    return {
      list: [
        { id: 1, name: 'Item 1' },
        { id: 2, name: 'Item 2' }
      ]
    }
  },
  methods: {
    onDragEnd() {
      console.log('拖拽完成')
    }
  }
}
</script>

使用原生 HTML5 Drag and Drop API

HTML5 提供了原生的拖拽 API,可以在 Vue 中直接使用:

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

<script>
export default {
  data() {
    return {
      list: [...],
      draggedItem: null
    }
  },
  methods: {
    handleDragStart(e, item) {
      this.draggedItem = item
      e.dataTransfer.effectAllowed = 'move'
    },
    handleDrop(e, targetItem) {
      const draggedIndex = this.list.indexOf(this.draggedItem)
      const targetIndex = this.list.indexOf(targetItem)
      this.list.splice(draggedIndex, 1)
      this.list.splice(targetIndex, 0, this.draggedItem)
    }
  }
}
</script>

表格列拖拽实现

对于表格列的拖拽排序,可以结合上述方法:

vue实现列拖拽

<template>
  <table>
    <thead>
      <tr>
        <th 
          v-for="(col, index) in columns" 
          :key="col.key"
          draggable="true"
          @dragstart="handleDragStart($event, index)"
          @dragover.prevent
          @drop="handleDrop($event, index)"
        >
          {{ col.title }}
        </th>
      </tr>
    </thead>
    <tbody>
      <tr v-for="row in data" :key="row.id">
        <td v-for="col in columns" :key="col.key">
          {{ row[col.key] }}
        </td>
      </tr>
    </tbody>
  </table>
</template>

<script>
export default {
  data() {
    return {
      columns: [
        { key: 'name', title: 'Name' },
        { key: 'age', title: 'Age' }
      ],
      data: [...],
      draggedColIndex: null
    }
  },
  methods: {
    handleDragStart(e, index) {
      this.draggedColIndex = index
      e.dataTransfer.effectAllowed = 'move'
    },
    handleDrop(e, targetIndex) {
      const cols = [...this.columns]
      const draggedCol = cols[this.draggedColIndex]
      cols.splice(this.draggedColIndex, 1)
      cols.splice(targetIndex, 0, draggedCol)
      this.columns = cols
    }
  }
}
</script>

注意事项

拖拽功能需要考虑浏览器兼容性问题,特别是移动端支持情况。对于复杂场景,建议使用成熟的库如 Vue.Draggable 或 Sortable.js。

拖拽状态需要合理管理,避免直接修改 props 数据,应该通过事件通知父组件。

性能优化方面,对于大数据量的列表,应该使用虚拟滚动等技术配合拖拽功能。

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

相关文章

vue功能实现

vue功能实现

Vue 功能实现指南 Vue.js 是一个渐进式 JavaScript 框架,广泛用于构建用户界面。以下是 Vue 功能的常见实现方法。 数据绑定 Vue 的核心功能之一是数据绑定,通过 v-mod…

vue 实现excel

vue 实现excel

Vue 实现 Excel 功能 前端导出 Excel 使用 xlsx 库可以轻松实现前端 Excel 导出功能。安装依赖: npm install xlsx 导出 Excel 示例代码: impo…

vue实现队列

vue实现队列

Vue 实现队列功能 在 Vue 中实现队列功能可以通过多种方式完成,以下是几种常见的方法: 使用数组模拟队列 队列遵循先进先出(FIFO)原则,可以用数组的 push 和 shift 方法模拟入队…

vue 实现$(id)

vue 实现$(id)

在 Vue 中实现类似 jQuery 的 $(id) 功能,可以通过以下几种方式操作 DOM 元素: 使用 ref 属性 Vue 推荐使用 ref 属性来直接访问 DOM 元素或组件实例。在模板中为…

vue递归实现

vue递归实现

vue递归实现方法 在Vue中实现递归组件通常用于树形结构、嵌套菜单等场景。以下是具体实现方式: 使用组件name属性递归 定义一个组件时,通过name属性让组件可以在自身模板中调用自己:…

vue前端实现

vue前端实现

Vue 前端实现基础步骤 安装 Vue.js 和相关依赖 通过 npm 或 yarn 安装 Vue.js,建议使用 Vue CLI 快速搭建项目。运行命令 npm install -g @vue/cl…