当前位置:首页 > 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实现多选题功能,可以通过v-model绑定数组、动态渲染选项、以及处理选中状态来实现。以下是一个完整的实现示例: 基础实现代码 <template>…

vue实现模块

vue实现模块

Vue 实现模块化的方法 Vue 支持多种模块化开发方式,可以根据项目需求选择适合的方案。 使用单文件组件(SFC) 单文件组件是 Vue 最常用的模块化方式,将模板、脚本和样式封装在一个 .vue…

vue实现看板

vue实现看板

Vue 实现看板功能 使用 Vue 实现看板功能可以通过组件化开发、状态管理和拖拽库结合完成。以下是一个完整的实现方案: 基础项目结构 src/ ├── components/ │ ├── Ka…

vue 实现树状

vue 实现树状

Vue 实现树状结构的方法 递归组件实现树状结构 递归组件是 Vue 中实现树状结构的常见方法。通过组件自身调用自身,可以轻松构建多层级树状结构。 <template> <ul…

vue实现datalist

vue实现datalist

使用 Vue 实现 HTML5 的 datalist 功能 HTML5 的 <datalist> 元素提供了一种自动完成输入框的功能,允许用户在输入时从预定义的选项列表中选择。以下是几种在…

vue实现增删

vue实现增删

Vue 实现增删功能 在 Vue 中实现增删功能通常涉及数据绑定、事件处理和列表渲染。以下是基于 Vue 2 或 Vue 3 的实现方法: 数据定义 初始化一个数组用于存储列表数据,并在 Vue 实…