当前位置:首页 > VUE

vue 原生实现拖拽

2026-03-08 21:54:39VUE

Vue 原生实现拖拽功能

在 Vue 中实现拖拽功能可以通过 HTML5 的拖放 API 结合 Vue 的事件绑定和数据响应式特性来完成。以下是具体实现方法:

设置可拖拽元素

为需要拖拽的元素添加 draggable 属性,并绑定相关事件:

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

处理拖拽事件

在 Vue 实例中定义拖拽相关的事件处理方法:

<script>
export default {
  methods: {
    handleDragStart(e) {
      e.dataTransfer.setData('text/plain', e.target.id)
      e.target.classList.add('dragging')
    },
    handleDragEnd(e) {
      e.target.classList.remove('dragging')
    }
  }
}
</script>

设置放置目标区域

为接收拖拽元素的区域绑定放置相关事件:

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

处理放置事件

实现放置区域的逻辑处理:

<script>
export default {
  methods: {
    handleDrop(e) {
      const id = e.dataTransfer.getData('text/plain')
      const draggableElement = document.getElementById(id)
      e.target.appendChild(draggableElement)
    }
  }
}
</script>

添加样式反馈

为拖拽过程添加视觉反馈:

<style>
.dragging {
  opacity: 0.5;
}
.dropzone {
  min-height: 100px;
  border: 2px dashed #ccc;
  padding: 10px;
}
</style>

数据驱动的拖拽实现

结合 Vue 的响应式数据实现更完整的拖拽逻辑:

vue 原生实现拖拽

<script>
export default {
  data() {
    return {
      items: [
        { id: 1, text: '项目1' },
        { id: 2, text: '项目2' }
      ],
      draggedItem: null
    }
  },
  methods: {
    handleDragStart(item) {
      this.draggedItem = item
    },
    handleDrop(index) {
      if (this.draggedItem) {
        const draggedIndex = this.items.indexOf(this.draggedItem)
        this.items.splice(draggedIndex, 1)
        this.items.splice(index, 0, this.draggedItem)
      }
    }
  }
}
</script>

完整示例代码

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

<script>
export default {
  data() {
    return {
      items: [
        { id: 1, text: '项目1' },
        { id: 2, text: '项目2' },
        { id: 3, text: '项目3' }
      ],
      draggedItem: null
    }
  },
  methods: {
    handleDragStart(item) {
      this.draggedItem = item
    },
    handleDrop(index) {
      if (this.draggedItem) {
        const draggedIndex = this.items.indexOf(this.draggedItem)
        const [removed] = this.items.splice(draggedIndex, 1)
        this.items.splice(index, 0, removed)
      }
    }
  }
}
</script>

<style>
.draggable-item {
  padding: 10px;
  margin: 5px 0;
  background: #f0f0f0;
  cursor: move;
}
.draggable-item[draggable="true"]:hover {
  background: #e0e0e0;
}
</style>

通过以上方法,可以在 Vue 中实现基本的拖拽功能。对于更复杂的场景,可以考虑使用专门的拖拽库如 Vue.Draggable 等。

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

相关文章

vue组件实现

vue组件实现

Vue 组件实现基础 Vue 组件是 Vue.js 的核心特性之一,允许将 UI 拆分为独立、可复用的模块。组件的实现包括定义、注册、数据传递和生命周期管理等。 定义组件 组件可以通过单文件组件(.…

vue实现缩放

vue实现缩放

Vue 实现缩放的方法 在 Vue 中实现缩放功能可以通过多种方式完成,以下是一些常见的方法: 使用 CSS transform 属性 通过 CSS 的 transform: scale() 属性可…

vue实现路由

vue实现路由

Vue 路由的实现方法 Vue 路由可以通过 Vue Router 库来实现,Vue Router 是 Vue.js 官方的路由管理器,用于构建单页面应用(SPA)。 安装 Vue Router 通…

vue 实现图钉

vue 实现图钉

实现图钉效果的步骤 在Vue中实现图钉(固定位置)效果,可以通过CSS的position: sticky属性或监听滚动事件动态修改元素样式。以下是两种常见方法: 方法一:使用CSS的posi…

vue删除实现

vue删除实现

Vue 删除功能的实现方法 在 Vue 中实现删除功能通常涉及以下几个步骤: 方法一:使用数组的 splice 方法 通过索引删除数组中的元素,适用于列表渲染的场景。 methods: {…

vue 实现异步加载

vue 实现异步加载

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