当前位置:首页 > VUE

利用vue实现拖拽

2026-01-16 04:03:07VUE

使用 Vue 实现拖拽功能

原生 HTML5 拖拽 API

Vue 可以结合 HTML5 的拖拽 API 实现基础拖拽功能。以下是一个简单示例:

<template>
  <div>
    <div 
      draggable="true" 
      @dragstart="handleDragStart"
      @dragend="handleDragEnd"
    >
      拖拽元素
    </div>

    <div 
      @dragover.prevent
      @dragenter.prevent
      @drop="handleDrop"
    >
      放置区域
    </div>
  </div>
</template>

<script>
export default {
  methods: {
    handleDragStart(e) {
      e.dataTransfer.setData('text/plain', '拖拽数据');
    },
    handleDrop(e) {
      const data = e.dataTransfer.getData('text/plain');
      console.log('接收到的数据:', data);
    },
    handleDragEnd() {
      console.log('拖拽结束');
    }
  }
}
</script>

使用第三方库 vue-draggable

对于更复杂的拖拽场景,推荐使用成熟的第三方库如 vue-draggable

安装依赖:

npm install vuedraggable

基本用法:

<template>
  <draggable 
    v-model="list"
    @start="dragStart"
    @end="dragEnd"
  >
    <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: '项目1' },
        { id: 2, name: '项目2' }
      ]
    }
  },
  methods: {
    dragStart() {
      console.log('开始拖拽');
    },
    dragEnd() {
      console.log('结束拖拽');
    }
  }
}
</script>

自定义拖拽指令

对于需要完全自定义的场景,可以创建 Vue 指令:

Vue.directive('drag', {
  bind(el, binding) {
    let startX, startY, initialX, initialY

    el.style.position = 'absolute'
    el.style.cursor = 'move'

    el.addEventListener('mousedown', startDrag)

    function startDrag(e) {
      startX = e.clientX
      startY = e.clientY
      initialX = el.offsetLeft
      initialY = el.offsetTop

      document.addEventListener('mousemove', drag)
      document.addEventListener('mouseup', stopDrag)
      e.preventDefault()
    }

    function drag(e) {
      el.style.left = `${initialX + e.clientX - startX}px`
      el.style.top = `${initialY + e.clientY - startY}px`
    }

    function stopDrag() {
      document.removeEventListener('mousemove', drag)
      document.removeEventListener('mouseup', stopDrag)
    }
  }
})

使用指令:

<div v-drag>可拖拽元素</div>

拖拽排序实现

结合 Vue 的响应式特性实现拖拽排序:

<template>
  <div class="container">
    <div 
      v-for="(item, index) in items"
      :key="item.id"
      class="draggable-item"
      draggable="true"
      @dragstart="handleDragStart(index)"
      @dragover.prevent="handleDragOver(index)"
      @dragenter="handleDragEnter(index)"
      @dragend="handleDragEnd"
    >
      {{ item.text }}
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      items: [
        { id: 1, text: '项目1' },
        { id: 2, text: '项目2' },
        { id: 3, text: '项目3' }
      ],
      draggedIndex: null,
      dragOverIndex: null
    }
  },
  methods: {
    handleDragStart(index) {
      this.draggedIndex = index
    },
    handleDragOver(index) {
      this.dragOverIndex = index
    },
    handleDragEnter(index) {
      if (this.draggedIndex !== null && this.draggedIndex !== index) {
        const draggedItem = this.items[this.draggedIndex]
        this.items.splice(this.draggedIndex, 1)
        this.items.splice(index, 0, draggedItem)
        this.draggedIndex = index
      }
    },
    handleDragEnd() {
      this.draggedIndex = null
      this.dragOverIndex = null
    }
  }
}
</script>

跨组件拖拽

实现跨组件拖拽需要利用 Vue 的事件总线或状态管理:

利用vue实现拖拽

// eventBus.js
import Vue from 'vue'
export const EventBus = new Vue()

// 拖拽源组件
methods: {
  startDrag() {
    EventBus.$emit('drag-start', this.item)
  }
}

// 放置目标组件
created() {
  EventBus.$on('drag-start', (item) => {
    this.draggedItem = item
  })
}

这些方法涵盖了从基础到高级的 Vue 拖拽实现方案,可根据具体需求选择合适的实现方式。

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

相关文章

vue功能实现

vue功能实现

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

vue实现单击

vue实现单击

Vue 实现单击事件的方法 在 Vue 中实现单击事件可以通过 v-on 指令或简写的 @ 符号绑定事件处理器。以下是几种常见的实现方式: 基础用法 通过 v-on:click 或 @click 绑…

vue实现联动

vue实现联动

Vue 实现联动效果 联动效果通常指多个组件或表单元素之间相互影响,例如选择省份后动态加载城市列表。Vue 提供了多种方式实现联动,包括数据绑定、计算属性、侦听器等。 数据驱动联动 通过 Vue 的…

vue实现首页

vue实现首页

Vue 实现首页的基本步骤 安装 Vue.js 和相关依赖,可以通过 Vue CLI 或 Vite 快速初始化项目。Vue CLI 适合传统项目,Vite 更适合现代前端开发。 npm instal…

vue搜索功能实现

vue搜索功能实现

Vue搜索功能实现方法 在Vue中实现搜索功能可以通过多种方式完成,以下是几种常见的方法: 使用计算属性实现搜索 计算属性非常适合处理需要根据输入值动态过滤数据的情况。创建一个计算属性,根据搜索关键…

vue 实现异步加载

vue 实现异步加载

Vue 实现异步加载的方法 使用动态 import 实现组件懒加载 在 Vue 中可以通过动态 import() 语法实现组件的异步加载,这会使得组件在需要时才被加载,减少初始加载时间。 const…