当前位置:首页 > VUE

使用vue实现拖拽功能

2026-02-20 17:37:53VUE

使用 Vue 实现拖拽功能

原生 HTML5 拖拽 API 实现

Vue 可以直接封装 HTML5 的拖拽 API,通过事件绑定实现基础拖拽功能。以下是核心实现步骤:

<template>
  <div 
    class="draggable-item" 
    draggable="true"
    @dragstart="handleDragStart"
    @dragend="handleDragEnd"
  >
    拖拽元素
  </div>
  <div 
    class="drop-zone" 
    @dragover="handleDragOver"
    @drop="handleDrop"
  >
    放置区域
  </div>
</template>

<script>
export default {
  methods: {
    handleDragStart(e) {
      e.dataTransfer.setData('text/plain', e.target.id)
      e.target.classList.add('dragging')
    },
    handleDragOver(e) {
      e.preventDefault() // 必须阻止默认行为
    },
    handleDrop(e) {
      e.preventDefault()
      const id = e.dataTransfer.getData('text/plain')
      const draggableElement = document.getElementById(id)
      e.target.appendChild(draggableElement)
    },
    handleDragEnd(e) {
      e.target.classList.remove('dragging')
    }
  }
}
</script>

使用第三方库 vue-draggable

对于更复杂的场景(如列表排序),推荐使用专为 Vue 设计的拖拽库 vue-draggable

安装依赖:

npm install vuedraggable

基础列表拖拽示例:

使用vue实现拖拽功能

<template>
  <draggable 
    v-model="list" 
    @end="onDragEnd"
    item-key="id"
  >
    <template #item="{element}">
      <div class="item">{{ element.name }}</div>
    </template>
  </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('新顺序:', this.list)
    }
  }
}
</script>

自定义拖拽指令

对于需要高度定制的场景,可以创建 Vue 自定义指令:

Vue.directive('drag', {
  bind(el, binding) {
    el.setAttribute('draggable', true)

    el.addEventListener('dragstart', (e) => {
      e.dataTransfer.setData('text', binding.value)
      el.style.opacity = '0.5'
    })

    el.addEventListener('dragend', () => {
      el.style.opacity = '1'
    })
  }
})

使用方式:

使用vue实现拖拽功能

<div v-drag="item.id" v-for="item in list">{{ item.text }}</div>

跨组件拖拽实现

通过 Vuex 或事件总线实现跨组件数据同步:

// 在拖拽放置区域
handleDrop(e) {
  const itemId = e.dataTransfer.getData('text')
  this.$store.commit('moveItem', {
    from: this.sourceComponent,
    to: this.targetComponent,
    id: itemId
  })
}

性能优化建议

大型列表场景下添加虚拟滚动支持 使用 CSS transform 代替 top/left 定位减少重绘 对静态元素使用 v-once 减少不必要的更新 通过 requestAnimationFrame 节流拖拽事件

移动端适配方案

添加 touch 事件支持:

el.addEventListener('touchmove', (e) => {
  e.preventDefault()
  const touch = e.touches[0]
  el.style.transform = `translate(${touch.clientX}px, ${touch.clientY}px)`
})

引入 hammer.js 等手势库处理复杂交互

标签: 拖拽功能
分享给朋友:

相关文章

vue实现拖拽实现布局

vue实现拖拽实现布局

Vue 实现拖拽布局的方法 使用 Vue.Draggable 库 Vue.Draggable 是基于 Sortable.js 的 Vue 组件,适合实现列表或网格的拖拽排序。 安装依赖: npm…

vue功能实现难点

vue功能实现难点

Vue 功能实现的常见难点 响应式系统深度监听 Vue 的响应式系统基于 Object.defineProperty(Vue 2)或 Proxy(Vue 3),但对嵌套对象或数组的深层属性变化需要额外…

vue 拖拽排序 实现

vue 拖拽排序 实现

实现拖拽排序的基本思路 在Vue中实现拖拽排序通常需要借助HTML5的拖放API或第三方库如sortablejs、vuedraggable等。以下是两种常见实现方式: 使用HTML5原生拖放API…

vue怎么实现拖拽

vue怎么实现拖拽

Vue 拖拽实现方法 使用 HTML5 原生拖拽 API HTML5 提供了原生拖拽 API,可以通过 draggable 属性、dragstart、dragend、dragover 和 drop 事…

vue实现销假功能

vue实现销假功能

实现销假功能的Vue方案 在Vue中实现销假功能通常需要结合前端界面、状态管理和后端API交互。以下是完整的实现方案: 基础组件结构 创建请假表单组件LeaveForm.vue: <temp…

vue实现拖拽图层

vue实现拖拽图层

Vue 实现拖拽图层的方法 使用原生 HTML5 拖拽 API HTML5 提供了原生的拖拽 API,可以通过 draggable 属性、dragstart、dragend、dragover 和 dr…