当前位置:首页 > VUE

vue实现列拖拽

2026-01-17 11:25:35VUE

Vue 实现列拖拽功能

使用原生 HTML5 拖放 API

在 Vue 中可以通过原生 HTML5 的拖放 API 实现列拖拽功能。需要处理 draggabledragstartdragoverdrop 事件。

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

<script>
export default {
  data() {
    return {
      items: ['Item 1', 'Item 2', 'Item 3', 'Item 4'],
      draggedIndex: null
    }
  },
  methods: {
    handleDragStart(event, index) {
      this.draggedIndex = index
      event.dataTransfer.effectAllowed = 'move'
    },
    handleDragOver(event, index) {
      event.preventDefault()
      event.dataTransfer.dropEffect = 'move'
    },
    handleDrop(event, index) {
      if (this.draggedIndex !== null) {
        const item = this.items.splice(this.draggedIndex, 1)[0]
        this.items.splice(index, 0, item)
        this.draggedIndex = null
      }
    }
  }
}
</script>

<style>
.draggable-item {
  padding: 10px;
  margin: 5px;
  background: #f0f0f0;
  cursor: move;
}
</style>

使用第三方库 Vue.Draggable

Vue.Draggable 是一个基于 Sortable.js 的 Vue 组件,可以更简单地实现拖拽功能。

vue实现列拖拽

安装依赖:

vue实现列拖拽

npm install vuedraggable

使用示例:

<template>
  <div>
    <draggable 
      v-model="items" 
      @start="drag=true" 
      @end="drag=false"
      item-key="id"
    >
      <template #item="{element}">
        <div class="draggable-item">
          {{ element.name }}
        </div>
      </template>
    </draggable>
  </div>
</template>

<script>
import draggable from 'vuedraggable'

export default {
  components: { draggable },
  data() {
    return {
      items: [
        { id: 1, name: 'Item 1' },
        { id: 2, name: 'Item 2' },
        { id: 3, name: 'Item 3' }
      ],
      drag: false
    }
  }
}
</script>

<style>
.draggable-item {
  padding: 10px;
  margin: 5px;
  background: #f0f0f0;
}
</style>

实现表格列拖拽

对于表格列的拖拽,可以使用类似的原理,但需要处理表头元素的拖放。

<template>
  <table>
    <thead>
      <tr>
        <th 
          v-for="(col, index) in columns" 
          :key="col.key"
          draggable="true"
          @dragstart="handleDragStart($event, index)"
          @dragover.prevent="handleDragOver($event, index)"
          @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' },
        { key: 'address', title: 'Address' }
      ],
      data: [
        { id: 1, name: 'John', age: 20, address: 'New York' },
        { id: 2, name: 'Jane', age: 24, address: 'London' }
      ],
      draggedColumnIndex: null
    }
  },
  methods: {
    handleDragStart(event, index) {
      this.draggedColumnIndex = index
      event.dataTransfer.effectAllowed = 'move'
    },
    handleDragOver(event, index) {
      event.preventDefault()
      event.dataTransfer.dropEffect = 'move'
    },
    handleDrop(event, index) {
      if (this.draggedColumnIndex !== null) {
        const column = this.columns.splice(this.draggedColumnIndex, 1)[0]
        this.columns.splice(index, 0, column)
        this.draggedColumnIndex = null
      }
    }
  }
}
</script>

注意事项

  • 移动设备不支持原生 HTML5 拖放 API,需要使用触摸事件或专门的移动端库
  • 复杂的拖拽场景建议使用成熟的第三方库如 Vue.Draggable
  • 拖拽操作会影响数据顺序,需要确保数据同步更新
  • 对于大型列表,考虑添加拖拽时的视觉反馈和性能优化

以上方法可以根据具体需求选择适合的实现方式,Vue.Draggable 提供了更多高级功能如动画、拖拽手柄、限制区域等,适合复杂场景。

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

相关文章

vue实现组件循环

vue实现组件循环

Vue 组件循环的实现方法 在 Vue 中实现组件循环通常使用 v-for 指令,可以循环渲染数组或对象的数据到组件上。 基本数组循环 通过 v-for 指令遍历数组,渲染多个相同结构的组件。…

vue卖座网实现

vue卖座网实现

Vue 卖座网实现 项目结构搭建 使用 Vue CLI 快速初始化项目,安装必要依赖如 Vue Router、Vuex、Axios。 创建核心目录结构:components(通用组件)、views(页…

vue弹幕实现不重叠

vue弹幕实现不重叠

实现 Vue 弹幕不重叠的方法 CSS 定位与动画控制 通过绝对定位和动态计算弹幕轨道高度,确保弹幕在不同轨道上运行。每条弹幕占据固定高度的轨道,避免重叠。 // 弹幕轨道高度计算 const tr…

vue实现选择本地文件

vue实现选择本地文件

实现文件选择功能 在Vue中实现本地文件选择可以通过HTML原生的<input type="file">元素实现。创建一个基本的文件选择组件: <template> &…

前端实现拖拽功能vue

前端实现拖拽功能vue

实现拖拽功能的基本方法 在Vue中实现拖拽功能可以通过HTML5的拖放API或第三方库如vuedraggable来完成。HTML5的拖放API提供了原生支持,而vuedraggable则简化了列表拖拽…

vue实现菜单栏锚点

vue实现菜单栏锚点

实现锚点菜单的基本思路 在Vue中实现菜单栏锚点功能,主要涉及两个方面:创建可跳转的锚点位置,以及菜单项的点击滚动控制。通过监听滚动事件可以高亮当前可见区域的对应菜单项。 创建页面锚点位置 在需要跳…