当前位置:首页 > VUE

vue实现数据拖动

2026-01-15 00:52:26VUE

Vue 实现数据拖动

使用 HTML5 拖放 API

HTML5 提供了原生的拖放 API,可以通过 draggable 属性、dragstartdragenddragoverdrop 事件来实现拖动功能。

<template>
  <div>
    <div 
      v-for="(item, index) in items" 
      :key="index"
      draggable="true"
      @dragstart="handleDragStart(index)"
      @dragend="handleDragEnd"
    >
      {{ item }}
    </div>
    <div 
      @dragover.prevent
      @drop="handleDrop"
    >
      拖放到这里
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      items: ['Item 1', 'Item 2', 'Item 3'],
      draggedIndex: null
    }
  },
  methods: {
    handleDragStart(index) {
      this.draggedIndex = index
    },
    handleDragEnd() {
      this.draggedIndex = null
    },
    handleDrop() {
      if (this.draggedIndex !== null) {
        const item = this.items.splice(this.draggedIndex, 1)[0]
        this.items.push(item)
      }
    }
  }
}
</script>

使用第三方库 Vue.Draggable

Vue.Draggable 是一个基于 Sortable.js 的 Vue 组件,提供了更简单的 API 来实现拖动功能。

安装 Vue.Draggable:

npm install vuedraggable

使用示例:

<template>
  <div>
    <draggable 
      v-model="items" 
      @end="onDragEnd"
    >
      <div v-for="(item, index) in items" :key="index">
        {{ item }}
      </div>
    </draggable>
  </div>
</template>

<script>
import draggable from 'vuedraggable'

export default {
  components: {
    draggable
  },
  data() {
    return {
      items: ['Item 1', 'Item 2', 'Item 3']
    }
  },
  methods: {
    onDragEnd() {
      console.log('拖动结束', this.items)
    }
  }
}
</script>

自定义拖动逻辑

如果需要更复杂的拖动逻辑,可以结合 Vue 的响应式特性和自定义事件来实现。

<template>
  <div>
    <div 
      v-for="(item, index) in items" 
      :key="index"
      @mousedown="startDrag(index, $event)"
      @mousemove="handleDrag($event)"
      @mouseup="stopDrag"
      :style="{ position: 'absolute', left: item.x + 'px', top: item.y + 'px' }"
    >
      {{ item.name }}
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      items: [
        { name: 'Item 1', x: 0, y: 0 },
        { name: 'Item 2', x: 100, y: 0 },
        { name: 'Item 3', x: 200, y: 0 }
      ],
      dragging: false,
      dragIndex: null,
      startX: 0,
      startY: 0
    }
  },
  methods: {
    startDrag(index, event) {
      this.dragging = true
      this.dragIndex = index
      this.startX = event.clientX - this.items[index].x
      this.startY = event.clientY - this.items[index].y
    },
    handleDrag(event) {
      if (this.dragging) {
        this.items[this.dragIndex].x = event.clientX - this.startX
        this.items[this.dragIndex].y = event.clientY - this.startY
      }
    },
    stopDrag() {
      this.dragging = false
      this.dragIndex = null
    }
  }
}
</script>

注意事项

  • 使用 HTML5 拖放 API 时,需要阻止默认行为(如 @dragover.prevent)。
  • Vue.Draggable 提供了更丰富的功能,如分组、动画等,适合复杂场景。
  • 自定义拖动逻辑需要处理鼠标事件和元素位置计算,适合特定需求。

vue实现数据拖动

标签: 拖动数据
分享给朋友:

相关文章

Vue数据依赖实现

Vue数据依赖实现

Vue数据依赖实现原理 Vue的数据依赖实现基于响应式系统,核心是通过Object.defineProperty或Proxy拦截数据读写操作,结合发布-订阅模式自动追踪依赖和触发更新。 核心机制…

vue实现数据渲染

vue实现数据渲染

Vue 数据渲染的实现方式 Vue.js 提供了多种数据渲染的方式,包括插值表达式、指令和计算属性等。以下是常见的实现方法: 插值表达式 使用双大括号 {{ }} 将数据绑定到模板中,数据变化时会…

vue 数据绑定实现

vue 数据绑定实现

Vue 数据绑定的实现方式 Vue 的数据绑定主要通过响应式系统和模板语法实现,以下是核心方法: 双向数据绑定(v-model) 通过 v-model 指令实现表单元素与数据的双向绑定,自动同步数据…

vue实现表格数据修改

vue实现表格数据修改

实现表格数据修改的基本思路 在Vue中实现表格数据修改通常涉及以下核心步骤:数据绑定、编辑状态切换、表单输入处理和数据提交。以下是一个典型实现方案: 数据绑定与渲染 使用v-for指令循环渲染表格…

vue实现重置表格数据

vue实现重置表格数据

重置表格数据的方法 在Vue中重置表格数据通常涉及清空或重新初始化数据绑定的数组或对象。以下是几种常见实现方式: 直接重置数据源 对于基于数组的表格数据,可以直接将数据数组重置为空或初始值:…

vue数据代理底层实现

vue数据代理底层实现

Vue 数据代理的底层实现原理 Vue 的数据代理是通过 Object.defineProperty 或 Proxy(Vue 3)实现的,将数据对象的属性代理到 Vue 实例上,使得可以直接通过 th…