当前位置:首页 > 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.js 可以通过结合 Electron 或 NW.js 等框架实现桌面应用开发。以下是几种常见的方法: 使用 Vue 与 Electron 结合 Electron…

php怎么实现登录功能

php怎么实现登录功能

数据库准备 创建用户表存储登录信息,通常包括用户名、密码(需加密)等字段。示例SQL: CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY…

php 实现聊天功能

php 实现聊天功能

PHP 实现聊天功能的方法 使用 WebSocket 和 Ratchet 库 WebSocket 是实现实时聊天的理想选择。Ratchet 是一个 PHP 库,用于处理 WebSocket 连接。…

php秒杀功能的实现

php秒杀功能的实现

秒杀功能的核心设计 高并发场景下秒杀系统的核心在于解决超卖问题和性能瓶颈。需要结合缓存、队列、锁机制等技术实现。 数据库设计 商品表需包含库存字段,例如: CREATE TABLE `seckil…

jquery 拖拽

jquery 拖拽

jQuery 拖拽实现方法 使用 jQuery 实现拖拽功能可以通过多种方式完成,以下是常见的几种方法: 使用 jQuery UI 的拖拽功能 jQuery UI 提供了 draggable 方法,…

jquery拖拽

jquery拖拽

jQuery拖拽实现方法 使用jQuery实现拖拽功能可以通过多种方式完成,以下是常见的实现方法: 使用jQuery UI的Draggable组件 jQuery UI提供了现成的拖拽组件,只需引入相…